一、进程间通信是什么
进程间通信(IPC),顾名思义,进程之间需要进行信息交换。 如:数据传输、资源共享、通知事件、进程控制。
进程间通信的方式有:管道、System V IPC、POSIX IPC。
由于进程具有独立性,进程间通信的前提就是,不同的进程能看到同一份资源。
二、管道
1. 什么是管道
管道是类 Unix 系统中最古老的进程间通信的方式。我们把从一个进程连接到另一个进程的数据流称为一个'管道'。

管道是单向通信的,称为单工通信。
管道分为匿名管道和命名管道。
2. 匿名管道
匿名管道(pipe)是亲缘进程间单向通信机制,本质是内核管理的一份文件,两个进程通过一对文件描述符实现一端读一端写,随进程退出自动销毁。匿名管道只能用在有血缘关系的进程之间!
系统调用 pipe,用于创建一个匿名管道。

参数是一个文件描述符数组,管道创建后,fd[0] 表示读端,fd[1] 表示写端。 成功创建返回 0,失败则返回错误码。

匿名管道是一个纯内存级的文件,不需要打开磁盘文件,没有路径,所以称为匿名管道。匿名管道没有名字、没有文件实体,只靠文件描述符来传递。这就是为什么它只能用在有血缘的进程之间,因为这些进程能拷贝文件描述符表,才能拿到同一根管道的读写端。
匿名管道通信有以下几种情况:
- 子进程写得慢,父进程就要阻塞等待。等到管道有数据,父进程才能读。
- 子进程写得快,父进程不读,管道一旦写满,子进程必须阻塞了。
- 读端一直读,写端关闭,读端读完管道中的数据时,read 返回 0,表明读到文件末尾。
- 写端一直写,读端关闭,操作系统会杀掉写端进程,进程异常终止,终止信号为 13!
管道还有以下特点:
- 管道只能单向通信。如果想要两个进程间互相通信,需要创建两个管道。
- 匿名管道只能用在有血缘关系的进程之间,因为必须继承文件描述符表。
- 管道是面向字节流的。多次写入的字节流,在读取时可能被一次读取完,也可能被拆分成多次。
- 管道的生命周期随进程。管道是内核中的临时对象,没有持久化到磁盘。当所有持有管道文件描述符的进程都关闭后,管道会被内核自动销毁,数据也随之丢失。
- 管道通信,对于多进程,自带同步与互斥机制。读空管道时,读进程会阻塞等待数据;写满管道时,写进程会阻塞等待空间。
使用演示:
{
pipefd[] = {};
((pipefd) != ) {
();
}
(, pipefd[], pipefd[]);
id = fork();
(id == ) {
(pipefd[]);
* msg = ;
cnt = ;
outbuffer[];
(cnt) {
(outbuffer, (outbuffer), , msg, cnt--);
(pipefd[], outbuffer, (outbuffer));
();
}
(pipefd[]);
();
}
(pipefd[]);
inbuffer[];
() {
inbuffer[] = ;
n = (pipefd[], inbuffer, (inbuffer) - );
(n > ) {
inbuffer[n] = ;
(, inbuffer);
} (n == ) {
();
(pipefd[]);
;
} {
();
;
}
}
rid = (id, , );
;
}






