Linux 进程间通信:命名管道(FIFO)实战指南
前言
在 Linux IPC(进程间通信)体系中,匿名管道解决了亲缘进程间的通信问题,但存在核心限制——仅支持具有共同祖先的进程通信。而命名管道(FIFO)作为匿名管道的扩展,通过文件系统中的'命名'标识,打破了亲缘关系的束缚,实现了无关联进程间的双向数据传输。
本文将从命名管道的核心概念、创建方式、通信原理和实战案例出发,带你吃透这一实用的跨进程通信技术。
一、命名管道核心概念:什么是 FIFO?
1.1 命名管道的定义
命名管道(Named Pipe),又称 FIFO(First In First Out),是一种特殊的文件系统对象(类型为 p)。其核心本质与匿名管道一致——内核中的一块缓冲区,但通过文件路径作为标识,让任意进程都能通过该路径访问管道,实现跨进程通信。
与匿名管道相比,命名管道的核心差异在于'命名':
- 匿名管道:无文件路径,仅通过
pipe()创建的文件描述符在亲缘进程间共享; - 命名管道:有明确的文件路径(如
/tmp/myfifo),任意进程可通过open()打开该路径,实现通信。
1.2 命名管道的核心特性
- 跨进程通信:支持无亲缘关系的进程(如两个独立的应用程序)通信,突破匿名管道的亲缘限制;
- 半双工通信:数据单向流动,如需双向通信需创建两个命名管道;
- 基于文件操作:遵循 Linux'一切皆文件'思想,通过
open()/read()/write()/close()等标准文件接口操作; - 生命周期随内核:命名管道创建后,即使创建进程退出,管道文件仍存在于文件系统中,需手动删除(
unlink()或rm命令); - 同步与互斥:内核自动保证管道操作的同步(如读阻塞、写阻塞)和互斥(同一时间仅允许一个进程写)。
1.3 命名管道和匿名管道的区别
为了更清晰地理解命名管道的定位,整理两者的核心差异如下表所示:
| 特性 | 匿名管道 (pipe) | 命名管道 (FIFO) |
|---|---|---|
| 定义 | 一种半双工通信通道,通常用于具有亲缘关系的进程之间。 | 一种特殊的文件(存在于文件系统中),允许无亲缘关系的进程间通信。 |
| 创建方式 | 通过 pipe() 系统调用创建,返回两个文件描述符。 | 通过 mkfifo() 或 mknod() 创建,在文件系统中具有路径名。 |
| 标识 | 无名,仅通过文件描述符引用。 | 有名,通过文件系统中的路径名标识。 |
| 进程关系 | 仅适用于有共同祖先(如父子进程)的进程。 | 适用于任意进程,无论是否有亲缘关系。 |
| 通信方向 |


