<aside>
💡 管道一般指匿名管道,它是 UNIX 系统 IPC(进程间通信)的最古老形式,所有的 UNIX 系统都支持这种通信机制
</aside>
管道通信
管道的例子——管道符

- ls 通过标准输出(stdout)将结果写入管道
- wc 通过标准输入(stdin)从管道中读取信息
管道的特点

- 管道其实是一个在内核内存中维护的缓冲器
- 这个缓冲器的存储能力是有限的,不同的操作系统大小不一定相同。
- 管道拥有文件的特质
- 可以进行读操作、写操作
- 匿名管道没有文件实体
- 有名管道有文件实体,但不存储数据。可以按照操作文件的方式对管道进行操作。
- 一个管道是一个字节流
- 使用管道时不存在消息或者消息边界的概念
- 从管道读取数据的进程可以读取任意大小的数据块,而不管写入进程写入管道的数据块的大小是多少。
- 通过管道传递的数据是顺序的
- 从管道中读取出来的字节的顺序和它们被写入管道的顺序是完全一样的。
- 在管道中的数据的传递方向是单向的
- 从管道读数据是一次性操作
- 数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据
- 在管道中无法使用 lseek() 来随机的访问数据。
- 匿名管道只能在具有公共祖先的进程之间使用
- 如:父进程与子进程、两个兄弟进程、其他具有亲缘关系的进程
为什么可以使用管道进行进程间通信?

- fork之后父进程与子进程的文件描述符表都指向同一个管道,所以可以进行进程间通信
- 管道具有文件的特质,使用文件描述符表可以指向管道的写端和读端
- 这也解释了为什么匿名管道只能在具有公共祖先的进程之间使用
管道的数据结构
<aside>
💡 管道使用环形队列组织数据
</aside>