首页/系统/Linux 运维命令速查/mkfifo 创建命名管道
文件与目录76 条

mkfifo 创建命名管道

创建 FIFO 文件实现进程间通信:一端写、一端读,数据不进磁盘;常用于流式备份与命令衔接。

Linux 运维命令速查系统更新于 2026-10-13

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 当作本地数据中转站。

易错点

  • 脚本里先启动写端:打开 FIFO 的动作被阻塞,任务看起来卡死
  • 用完忘记删除 FIFO:后续程序按普通文件打开它又阻塞一次
  • 写端持续写大量数据而读端很慢:写端阻塞,进程长时间没有输出
  • 把 FIFO 当普通文件做大小或内容检查:du 恒为 0,内容也不留存

数据来源与参考

  • man 1 mkfifo(GNU coreutils 手册)
  • man 7 fifo(Linux man-pages 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌