1. 进程间通信(IPC)基础概念
1.1 什么是进程间通信
进程间通信(IPC)指两个或多个进程进行信息相互传递的过程。
- 进程独立性:每个进程拥有独立的内核数据结构与代码数据空间。
- 非 IPC 示例:父子进程间的全局变量共享仅是
fork()时的写时复制初始状态,并非双向、持续的通信机制。一个进程崩溃通常不会直接影响另一个进程。
1.2 为什么需要 IPC
- 数据传输:进程间传递数据。
- 资源共享:多个进程共享同一资源。
- 通知事件:进程间发送状态或事件通知(如子进程终止通知父进程)。
- 进程控制:如调试器拦截被调试进程的异常与状态。
1.3 如何实现 IPC
核心前提:让不同的进程看到同一份资源。操作系统必须提供相应的系统调用来创建和管理这份共享资源。
2. IPC 标准与发展
早期 Unix 系统缺乏统一标准,后逐渐形成 System V IPC 标准(包含共享内存、消息队列、信号量)。随着技术发展,POSIX 标准及现代网络通信机制逐渐成为主流,但 System V 的核心思想仍具重要参考价值。
3. 匿名管道(Pipe)
3.1 核心特点
- 基于文件,单向通信:数据只能单向流动。
- 血缘限制:仅适用于具有亲缘关系的进程(通常为父子进程)。
- 生命周期随进程:管道本质是内核缓冲区,随相关进程退出而自动销毁。
- 自带同步机制:读写阻塞特性天然实现进程同步。
- 面向字节流:读写次数无需严格匹配,数据以字节流形式传输。
3.2 典型读写场景
- 写慢读快:读端阻塞,等待写端数据就绪。
- 写快读慢:读端一次性读取缓冲区中所有可用数据。
- 写端关闭:读端
read()返回0(EOF)。 - 读端关闭:写端继续写入会触发
SIGPIPE信号,导致写端进程终止。
4. 进程池与管道协同
进程池通过父进程预先创建多个子进程,利用管道分发任务。
- 常见陷阱:父进程关闭管道写端后,必须循环调用
waitpid()回收所有子进程,否则会产生僵尸进程。 - 任务分发:通常采用轮询或哈希方式将任务码通过管道发送给空闲子进程。
5. 命名管道(FIFO)
命名管道在文件系统中创建一个特殊文件(类型为 p),使无血缘关系的进程也能通过路径名找到同一份资源。
5.1 核心机制
- 客户端无需创建:只需使用
open()打开已存在的 FIFO 文件。 - 打开阻塞同步:
open()默认阻塞,直到读写两端均打开该管道。 - 字节流传输:无需手动处理 C 风格字符串的
\0,按实际读取字节数处理即可。


