1. 命名管道基础概念解析
命名管道(Named Pipe)是Linux系统中一种特殊的进程间通信(IPC)机制,它允许无亲缘关系的进程通过文件系统路径进行数据交换。与匿名管道不同,命名管道以特殊文件形式存在于文件系统中,具有以下典型特征:
- 文件系统可见性:通过
mkfifo命令创建的管道文件会出现在指定目录 - 持久化存在:不依赖进程生命周期,除非显式删除
- 全双工通信:支持双向数据流动(但实际实现中常表现为半双工)
- 阻塞式I/O:默认读写操作会阻塞直到另一端准备好
我在实际项目中发现,命名管道特别适合以下场景:
- 需要长期存在的通信通道
- 跨语言进程通信(比如Python和C程序交互)
- 需要文件接口的遗留系统改造
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 命名管道创建与使用详解
2.1 命令行创建方式
最直接的创建方式是使用mkfifo命令:
bash复制mkfifo /tmp/my_pipe
chmod 660 /tmp/my_pipe # 建议设置合适权限
创建后可通过ls -l查看文件类型:
code复制prw-rw---- 1 user group 0 Jun 1 10:00 /tmp/my_pipe
首字母p表示这是一个管道文件。
2.2 编程创建方法
C语言中使用mkfifo()函数:
c复制#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
典型错误处理模式:
c复制if (mkfifo("/tmp/my_pipe", 0666) == -1) {
if (errno != EEXIST) { // 忽略已存在错误
perror("mkfifo failed");
exit(EXIT_FAILURE);
}
}
重要提示:创建管道后必须至少有一个进程以读方式打开,另一个以写方式打开,否则单独打开会阻塞。
3. 命名管道通信实战
3.1 基础读写示例
写进程示例(writer.c):
c复制int fd = open("/tmp/my_pipe", O_WRONLY);
write(fd,
