1. 准备阶段:进程间通信的概念
1.1 本质前提
进程间通信(IPC)指的是两个或多个进程之间进行信息传递的过程。我们知道,进程具有独立性,一个进程的数据通常无法直接被另一个进程访问。虽然父进程的全局变量在子进程创建时可见,但这不算严格的 IPC,因为这种关系是单向的且不可持续。
核心原则:一个进程的挂掉不应影响其他进程,即使是父子进程也是如此。
要让不同的进程看到同一份资源,操作系统必须提供系统调用支持。
1.2 目的
为什么要进行 IPC?主要为了以下目标:
- 数据传输:一个进程将数据发送给另一个进程。
- 资源共享:多个进程共享同一份资源。
- 通知事件:通知其他进程发生了特定事件(如进程终止)。
- 进程控制:完全控制另一个进程的执行(如调试器拦截异常)。
1.3 实现思路
IPC 的本质前提是让不同的进程看到同一份资源。后续的大多数 IPC 实现都是围绕这一核心展开的。
2. 进程间通信标准与发展
2.1 System V 标准
相对于网络标准的严格性,系统级的 IPC 标准经历了一个发展过程。System V 是其中一种重要的标准体系。
2.2 发展历程
IPC 技术随着操作系统的发展不断演进,从早期的管道到现代的共享内存和消息队列,各有其适用场景。
3. 管道的特点与情况总结
3.1 五大特点
- 单向通信:设计之初仅允许单项数据传输。
- 血缘关系:通常用于具有亲缘关系的进程(如父子进程)。
- 生命周期:管道本质是文件,随打开它的进程退出而关闭。
- 同步机制:内部实现了进程间的同步。
- 字节流:面向字节流,读写次数可能不匹配。
3.2 典型场景
- 写慢读快:以慢节奏为准,读端等待数据就绪。
- 写快读慢:读端一次性读取所有写入的数据。
- 写端关闭:若写端
close(wfd),读端会收到 EOF。 - 读端关闭:若读端
close(rfd)且不读,写端继续写入会导致 SIGPIPE。
4. 进程池应用
4.1 协同与 Bug 修复
在实现进程池时,需要体现进程间的协同工作。例如,通过任务码遍历通道轮询任务。如果只退出了一个子进程而未回收所有僵尸进程,会导致资源泄漏。
修复方案:确保在主进程中循环等待并回收所有子进程的状态。
// 伪代码示例:主进程等待子进程
while(waitpid(-1, NULL, 0) > 0);
4.2 创建 10 个子进程示例
创建一个包含 10 个子进程的池,每个子进程处理特定任务,主进程负责监控和回收。


