Linux 进程间通信:命名管道(FIFO)实战指南
在 Linux 的 IPC(进程间通信)体系中,匿名管道解决了亲缘进程间的通信问题,但存在核心限制——仅支持具有共同祖先的进程。命名管道(FIFO)作为匿名管道的扩展,通过文件系统中的'命名'标识,打破了亲缘关系的束缚,实现了无关联进程间的双向数据传输。
一、命名管道核心概念
1.1 什么是 FIFO?
命名管道(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() 函数或 mkfifo 命令 |
| 标识 | 文件描述符 | 文件系统路径 |
| 进程关系 | 仅适用于有共同祖先 | 适用于任意进程 |
| 持久性 | 随进程关闭而销毁 | 随文件系统存在,需手动删除 |
| 打开方式 | 创建即打开 | 需显式 open() 打开路径 |
两者在通信机制、数据模型(字节流)、阻塞行为上高度相似,唯一的区别在于创建与打开的方式。


