进程间的通信-有名管道和无名管道 目录一、无名管道Unnamed Pipe / pipe半双工1. 概念2. 创建方式参数说明本质3. 使用流程重点4. 读写规则4.1 读端行为4.2 写端行为5. 管道关闭规则非常重要5.1 关闭写端5.2 关闭读端进程通信本质关系二、有名管道Named Pipe / FIFO半双工1. 概念2. 创建方式方法1命令创建方法2系统调用打开方式3. 读写规则和 pipe 类似5.1 读端5.2 写端三、有名管道和无名管道特点对比一、无名管道Unnamed Pipe / pipe半双工1. 概念无名管道是一种内核提供的临时通信缓冲区队列用于有亲缘关系的进程通信父子进程。特点只能用于有关系的进程父子/兄弟没有文件名生命周期随进程结束而消失2. 创建方式int pipe(int pipefd[2]);参数说明pipefd[0]读端read endpipefd[1]本质内核创建一个环形队列/缓冲区写端 → [ 内核缓冲区队列 ] → 读端3. 使用流程重点先 pipe再 fork原因fork 后子进程会继承父进程的 fd从而共享同一个管道缓冲区4. 读写规则4.1 读端行为情况1管道无数据read() → 阻塞进入等待态情况2管道有数据read() → 立即返回,返回值 实际读取字节数4.2 写端行为情况1正常写write() → 写入缓冲区情况2读端关闭write() → 触发 SIGPIPE 信号进程默认退出崩溃5. 管道关闭规则非常重要5.1 关闭写端如果写端全部关闭读端仍在读那么read() → 返回 0含义 表示“文件结束 EOF”5.2 关闭读端如果读端关闭写端还在写那么write() → 进程被 SIGPIPE 杀死进程通信本质关系pipe 是单向通信写进程 → 管道 → 读进程如果需要双向通信必须用两个 pipe二、有名管道Named Pipe / FIFO半双工1. 概念有名管道是有文件名的管道本质仍然是内核缓冲区队列但通过文件路径访问2. 创建方式方法1命令创建open()read/write()mkfifo /示例 mkfifo(myfifo, 0664);方法2系统调用#include sys/types.h #include sys/stat.h int mkfifo(const char *pathname, mode_t mode); //示例 mkfifo(myfifo, 0664);打开方式open(myfifo, O_RDONLY);open(myfifo, O_WRONLY);3. 读写规则和 pipe 类似5.1 读端没数据 → 阻塞有数据 → 返回5.2 写端无读者 → 阻塞或失败取决于模式有读者 → 正常写入三、有名管道和无名管道特点对比项目无名管道有名管道是否有名字没有有文件名使用范围父子进程任意进程生命周期随进程文件存在即存在通信方式内存队列文件路径访问创建方式pipe()mkfifo()