介绍
管道(Pipe)是操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,它允许一个进程的输出直接作为另一个进程的输入。管道主要分为以下两种类型:
-
无名管道(Unnamed Pipe):
- 无名管道是半双工的,也就是说数据只能在一个方向上流动,要么从写入端流向读取端,要么反之。
- 管道是存在于内存中的,由内核管理的一个缓冲区。
- 管道的两端通过文件描述符(file descriptor)进行访问,通常是一个数组,如
int fd[2]
,其中fd[0]
用于读取,fd[1]
用于写入。 - 管道通常用于父子进程之间的通信,因为无名管道只能在具有亲缘关系的进程之间使用。
- 当写入的数据超过管道的缓冲区容量时,写入操作会被阻塞,直到有进程从管道中读出数据。
-
命名管道(Named Pipe或FIFO,First-In-First-Out):
- 命名管道是在文件系统中创建的一个特殊文件,因此它可以用于不相关的进程之间的通信。
- 命名管道既可以用于半双工通信,也可以通过创建两个命名管道实现全双工通信。
- 任何知道命名管道路径的进程都可以打开并使用它进行通信。
- 命名管道的使用方式与普通文件类似,可以使用标准的文件I/O函数进行读写操作。