Linux 下的管道通信大家都不陌生,但匿名管道只能父子进程用,碰上没血缘关系的进程就抓瞎了。命名管道(FIFO)就是为这种事准备的——它给管道一个文件系统入口,任何进程只要知道路径就能通信。
这篇文章记录我使用 FIFO 的过程,包括创建、通信和那些容易掉的坑。
命名管道是什么?
命名管道本质上和匿名管道一样,都是内核缓冲区的字节流,半双工(单向流动)。区别在于它有一个'文件'挂在文件系统上,类型标识为 p。这个文件不存数据,只是一个入口。因为有了这个可见的路径,无关进程就能通过 open 获取读写描述符,直接通信。

关键特性:
- 半双工,想双向就得建两个 FIFO。
- 打开时默认阻塞:读端打开会等写端,写端会等读端,除非设置 O_NONBLOCK。
- 进程退出后 FIFO 文件还在,得手动 unlink 删除。
- 跨进程通信,跟血缘没关系。
创建命名管道
两种方式:命令行 mkfifo 命令,或者代码里调用 mkfifo 函数。
命令行方式
mkfifo myfifo
ls -l myfifo # 看到文件类型是 p,大小永远是 0
你往里面写多少数据,文件大小都不变,证实它只是个标识。
代码方式(mkfifo 函数)
#include <sys/stat.h>
#include <sys/types.h>
int mkfifo(const char *pathname, mode_t mode);
创建一个最小例子:
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
{
ret = (FIFO_PATH, );
(ret == ) {
(errno != EEXIST) {
();
;
}
();
} {
();
}
;
}


