Linux 进程间通信进阶:管道与共享内存实战
1. 进程间通信基础概念
1.1 本质与前提
进程间通信(IPC)指的是两个或多个进程进行信息传递的过程。由于进程具有独立性,一个进程的数据无法直接访问另一个进程的内存空间。父进程的全局变量对子进程不可见,或者即使可见也无法持续同步。
要让不同的进程看到同一份资源,操作系统必须提供系统调用作为桥梁。这是 IPC 的本质前提。
1.2 通信目的
- 数据传输:将一个进程的数据发送给另一个进程。
- 资源共享:多个进程共享同一块资源。
- 通知事件:发送消息通知其他进程状态变化(如进程终止)。
- 进程控制:完全控制另一个进程的执行(如调试器拦截异常)。
2. 管道通信
2.1 管道特点
管道是内核中实现的一种单向数据流通道,具有以下特点:
- 单向性:设计之初只允许单项数据通信。
- 血缘关系:通常用于具有父子关系的进程之间。
- 生命周期:管道随进程退出而关闭,文件描述符的生命周期依附于进程。
- 同步机制:内部实现了进程间的同步。
- 字节流:面向字节流,读写次数可能不匹配。
2.2 常见场景
- 写端慢读端快:以慢节奏为准,读端等待数据就绪。
- 写端快读端慢:读端一次性读取所有写入的数据。
- 写端关闭:若写端
close(wfd),读端会收到 EOF。 - 读端关闭:若读端
close(rfd),写端继续写入会导致 SIGPIPE 信号。
3. 进程池示例
在构建进程池时,需要注意资源回收。如果只退出了一个子进程而未回收所有僵尸进程,会导致资源泄漏。
修复方法是在主进程中遍历并回收所有子进程的状态。以下是创建 10 个子进程的简化逻辑:
// 伪代码逻辑示意
for (int i = 0; i < process_number; ++i) {
pid_t pid = fork();
if (pid == 0) {
// 子进程执行任务
task_function(i);
exit(0);
}
}
// 等待所有子进程结束
while (wait(NULL) > 0);
4. 命名管道(FIFO)
命名管道允许毫不相干的进程之间进行通信,它本质上是一个特殊的文件。


