命名管道(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。
至此,我们再次来回顾下三种管道的差异