Linux 命名管道(FIFO)跨进程通信
在 Linux 进程间通信(IPC)中,管道是最基础的方式之一。但常用的匿名管道有一个局限——只能用于有血缘关系的进程(如父子进程)。命名管道(FIFO) 则通过文件系统作为媒介,让任意两个进程(无论是否有血缘关系)都能实现数据交互。
一、命名管道是什么?
1. 本质区别
命名管道和匿名管道的核心通信逻辑一致,都是基于内核缓冲区的字节流半双工通信。核心区别在于:命名管道有一个可见的文件系统入口(一个 FIFO 文件),而匿名管道没有。
简单来说,匿名管道是'隐式的、血缘专属',命名管道是'显式的、通用的'。只要知道 FIFO 文件的路径,任意进程都能与之通信。
2. 核心特点
- 跨进程通信:无血缘关系的进程可通过 FIFO 路径通信;
- 半双工通信:数据单向流动,双向通信需创建两个 FIFO;
- 基于文件标识:FIFO 存在于文件系统中,通过打开文件获取描述符;
- 阻塞特性:默认读端阻塞直到写端打开,反之亦然(可设 O_NONBLOCK 非阻塞);
- 生命周期:FIFO 文件不会随进程退出自动删除,需手动清理。

3. 对比匿名管道
| 维度 | 匿名管道 (pipe) | 命名管道 (FIFO) |
|---|---|---|
| 通信范围 | 有血缘关系进程 | 任意进程 |
| 标识方式 | 无文件,靠 FD 继承 | 有文件系统入口 |
| 创建方式 | pipe() 系统调用 | mkfifo() 或命令 |
| 生命周期 | 进程退出销毁 | 文件删除才销毁 |
二、创建方式
1. 命令行创建
使用 mkfifo 命令快速测试:
# 创建名为 myfifo 的管道
mkfifo myfifo
# 查看类型标识为 p
ls -l myfifo
创建的管道文件最前面的标识是 p,验证了它不是普通文件,写入时文件大小不变。


