Linux进程与线程(4)

发布时间:2026/8/30 17:04:17
Linux进程与线程(4) Linux进程间通信‑管道无名管道有名管道一、无名管道 pipe核心特性只支持有亲缘关系进程通信父子、兄弟进程。没有实体文件仅存在内核。单向半双工pipe得到两个文件描述符 pipefd[0] 读端 pipefd[1] 写端。数据只能单向流动双向通信要创建两组管道。必须先调用 pipe() 创建管道再 fork() 子进程复制父进程的文件描述符才能通信。管道阻塞规则管道有写端存在有数据 read 直接读出数据无数据 read 阻塞休眠等待对方write写入数据所有写端全部关闭有残留数据读完现有数据无数据 read 返回0代表读到末尾不会阻塞管道有读端存在缓冲区未满(管道默认64KB) write 直接写入缓冲区写满 write 阻塞等待读端取走数据所有读端全部关闭进程执行 write 触发管道破裂SIGPIPE信号程序直接异常退出。关键点写端、读端的打开关闭状态直接决定read/write是阻塞、返回0还是程序崩溃。二、有名管道 FIFOmkfifo核心特性支持任意两个进程通信不需要亲缘关系。会在磁盘生成p类型管道文件但磁盘不存数据数据仍然存放在内核缓冲区。open行为特殊必须读写两端同时打开成功open函数才会返回只打开一端程序阻塞等待另一端进程打开管道。这也是写代码最容易踩坑的地方。同样单向双向聊天必须两条有名管道一条A写B读一条B写A读。接口int mkfifo(const char *pathname, mode_t mode);pathname管道文件路径mode权限。返回0成功‑1失败。重复执行mkfifo文件已存在会报错可以忽略该错误不影响后续open。三、无名管道 vs 有名管道对比无名管道pipe无磁盘文件仅限亲缘进程先pipe后forkshell | 底层就是无名管道。有名管道mkfifo磁盘存在管道文件任意进程open会阻塞双向通信需要两组FIFO。重点总结pipe无名管道只能父子进程没有实体文件通信依赖fork复制fd。牢记4条read/write阻塞规则SIGPIPE管道破裂是高频考点。mkfifo有名管道任意进程可通信open会阻塞等待两端双向聊天必须两条管道。管道属于字节流不识别行消息边界靠程序自己约定常用 \n 换行。代码易错点FIFO不要单边open路径要完全一致mkfifo重复调用报错可以忽略。当所有读端关闭继续write → SIGPIPE进程直接退出所有写端关闭read返回0。