mkfifo 是什么
mkfifo 创建一个命名管道(FIFO)文件,让两个互不相关的进程通过文件路径交换数据。FIFO 在磁盘上只是一个特殊节点:数据不落盘,也没有大小,写端与读端必须同时打开才会开始流动,否则打开动作会阻塞。它常用来把一条命令的输出直接喂给另一条命令或另一台机器。
基本信息
| 用途 | 创建命名管道实现进程间通信 |
|---|---|
| 语法 | mkfifo [-m 权限] 路径 |
| 特性 | 无数据缓存,写端阻塞到读端打开 |
| 识别方式 | ls -l 首字符为 p,du 显示占用为 0 |
典型使用场景
- 两台机器之间流式传输备份:打包后经 FIFO 走 ssh 落盘
- 把某程序的输出实时喂给只接受文件路径的工具
- 在速度不匹配的两个程序之间做数据中转
- 让不共享管道的两个进程(不同用户、不同会话)交换数据
- 调试数据流:中间插入观察点而不改程序本身
- 配合权限设置,限制只有特定用户可读写的通道
两终端演示与实战
两终端演示与实战
mkfifo /tmp/myfifo # 创建命名管道
ls -l /tmp/myfifo # 类型为 p,权限按需设置
cat /tmp/myfifo # 终端一:读端,会先阻塞等待
echo hello > /tmp/myfifo # 终端二:写端
mkfifo /tmp/pipe && tar czf - /data > /tmp/pipe & # 后台写端
ssh backup@nas 'cat > /backup/data.tgz' < /tmp/pipe # 读端走 ssh
rm -f /tmp/pipe # 用完立即清理,避免残留
mkfifo -m 600 /tmp/securepipe # 仅属主可读写特性与注意
| 项 | 含义 | 备注 |
|---|---|---|
| 文件类型 p | 命名管道 | ls -l 首字符显示为 p |
| du 为 0 | 不占数据块 | 内容不落盘,重启后自然消失 |
| 打开即阻塞 | 两端都打开才流动 | 先起读端可避免脚本卡住 |
| 残留 FIFO | 被当普通文件打开仍阻塞 | 用完必须删除 |
| -m 权限 | 创建时设置权限 | 与 chmod 的八进制写法一致 |
打开 FIFO 会阻塞到另一端也打开:脚本里要么先把读端放到后台,要么严格按「先读后写」的顺序启动,否则会表现为程序卡死。
用完一定要删除 FIFO:残留的管道文件被后续程序按普通文件打开时同样会阻塞,进而引发难以定位的故障。
FIFO 只是本机通信手段,不能跨主机使用;需要跨主机传输时配合 ssh 或网络工具,把 FIFO 当作本地数据中转站。