管道(pipe)是进程间通信的一种实现方式。在 Linux 系统中,管道本质上是一种特殊的文件,它的主要用途是实现进程间的通信。文中演示所用环境为 Ubuntu 18.04 desktop。
在 shell 中执行下面的命令:
$ echo abc | cat
echo 命令的输出通过管道作为了 cat 命令的输入。这里面的具体操作是由 shell 程序完成的。
管道的一个显著特点是:创建一个管道后,会获得两个文件描述符,分别用于对管道进行读取和写入操作。通常将这两个文件描述符称为管道的读取端和写入端,从写入端写入管道的任何数据都可以从读取端读取。
对一个进程来说,管道的写入和读取操作与写入和读取一个普通文件没有什么区别,只是在内核中通过这种机制来实现进程间的通信而已。
管道的创建和关闭
创建管道使用的系统调用的函数声明如下:
#include
int pipe(int filedescriptors[2]);
pipe 函数相对来说是一个比较底层的函数,它创建一个管道(相对于命名管道而言,这个管道又被称为匿名管道)。参数 filedescriptors 是一个长度为 2 的整型数组,用于存放调用该函数所创建管道的文件描述符。其中 filedescriptors[0] 存放管道读取端的文件描述符,filedescriptors[1] 存放管道写入端的文件描述符。调用成功时,返回值为 0;调用失败时,返回值为 -1。
由此可知,管道本身是一个抽象的概念,其本质是通过对特殊文件的读写实现进程间的通信。一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个文件描述符进行,它们分别代表管道的两端。因此管道是