命名管道(named pipe)又被称为先进先出队列(FIFO),是一种特殊的管道,存在于文件系统中。命名管道与管道非常类似,但是又有自身的显著特征:
- 命名管道可以用于任何两个进程间的通信,而不限于同源的两个进程。
- 命名管道作为一种特殊的文件存放在文件系统中,而不是像管道那样存放在内核中。当进程对命名管道的使用结束后,命名管道依然存在于文件系统中,除非对其进行删除操作,否则该命名管道不会自行消失。
和管道一样,命名管道也只能用于数据的单向传输,如果要用命名管道实现两个进程间数据的双向传输,建议使用两个单向的命名管道。
可以通过命令行命令 mkfifo 或 mknod 创建命名管道:
int mkfifo(const char *pathname, mode_t mode);
- pathname: 是一个字符串指针,用于存放命名管道的文件路径。
- mode: 用于表示指定所创建文件的权限。S_IFIFO | 0666;
- 成功时返回 0;调用失败时返回 -1。
int mknod(char *pathname, mode_t mode, dev_t dev);
- pathname: 是一个字符串指针,用于存放命名管道的文件路径。
- mode: 用于表示指定所创建文件的权限。S_IFIFO | 0666;
- dev_t:类型为 S_IFCHR 或 S_IFBLK 的时候该文件才有设备号,创建普通文件时传入0。即可创建命名管道时,为第三个参数 dev 传递 0表示该文件不是一个设备文件。
- 成功时返回 0;调用失败时返回 -1。
至此,我们再次来回顾下三种管道的差异
- 匿名管道PIPE: 存放在内核中, 只能在父子或者兄弟进程间使用.
- 标准流管道pipe:针对匿名管道PIPE一系列封装。返回文件流。
- 命名管道fifo:一种特殊的文件存放在文件系统中, 可以在许多并不相关的进程之间进行通讯.