Linux 命名管道(FIFO)通信:原理与跨进程实战
在 Linux 进程间通信(IPC)中,管道是最基础的方式之一。但平时接触的'匿名管道'有个局限——只能用于有血缘关系的进程(如父子进程),无法实现无关联进程间的通信。
命名管道(FIFO) 正是为了解决这个问题而生。它给管道赋予了一个文件名,通过文件系统作为媒介,让任意两个进程都能通过这个'命名'实现数据交互。
一、先搞懂:命名管道是什么?
1. 核心本质
命名管道和匿名管道的底层逻辑一致,都是基于字节流的半双工通信,依赖内核缓冲区。区别在于:命名管道有一个可见的文件系统入口。这个文件只是一个标识,不存储实际数据,而匿名管道没有文件入口,只能通过文件描述符继承。
简单来说:匿名管道是'隐式的、血缘专属',命名管道是'显式的、通用的'。只要知道 FIFO 文件的路径,任意进程都能与之通信。
2. 关键特性
- 跨进程通信:无血缘关系的进程也能通信。
- 半双工:数据单向流动,双向需创建两个 FIFO。
- 阻塞特性:默认打开读端会阻塞直到有写端,反之亦然(可通过
O_NONBLOCK调整)。 - 生命周期:文件不会随进程退出自动删除,需手动清理。
| 对比维度 | 匿名管道 (pipe) | 命名管道 (FIFO) |
|---|---|---|
| 通信范围 | 有血缘关系进程 | 任意进程 |
| 标识方式 | 无文件标识 | 文件系统入口 |
| 创建方式 | pipe() 系统调用 | mkfifo() 或命令 |
| 生命周期 | 随进程退出销毁 | 随文件删除销毁 |
二、创建与打开规则
1. 创建方式
可以通过命令行或代码创建,本质都是在文件系统生成一个 FIFO 类型文件。
命令行创建
# 创建名为 myfifo 的管道
mkfifo myfifo
# 查看文件类型(p 开头表示管道)
ls -l myfifo
代码创建
使用 mkfifo() 函数,需指定路径和权限。
#include <sys/stat.h>
#include <sys/types.h>
;


