mkfifo 是 Linux 系统中用于创建命名管道(FIFO)的命令行工具。命名管道是一种特殊的文件类型,允许不相关的进程通过文件系统进行通信。
基本语法
bash
mkfifo [选项] 文件名
常用选项
-m, --mode=MODE:设置管道文件的权限模式(类似 chmod)-Z:设置 SELinux 安全上下文--context=CTX:类似 -Z,但指定完整的 SELinux 安全上下文
工作原理
命名管道(FIFO)与普通管道的主要区别在于:
- 命名管道在文件系统中有一个实体文件
- 不要求通信进程之间有父子关系
- 可以被多个进程同时读写
使用示例
基本使用
bash
mkfifo mypipe
这将创建一个名为"mypipe"的FIFO文件,默认权限为666(受umask影响)
指定权限
bash
mkfifo -m 644 named_pipe
创建一个权限为644的命名管道
进程间通信示例
在终端1中:
bash
mkfifo pipe_test
cat pipe_test # 等待读取数据
在终端2中:
bash
echo "Hello FIFO" > pipe_test
终端1将显示"Hello FIFO"
应用场景
- 脚本间通信:不同shell脚本之间的数据传递
- 日志处理:实时将日志通过管道传递给处理程序
- 进程同步:协调多个独立进程的执行顺序
- 网络代理:作为本地进程和网络服务之间的中介
注意事项
- 命名管道会一直存在于文件系统中,直到被显式删除
- 读写操作默认是阻塞的,可以使用
O_NONBLOCK标志改变这一行为 - 多个进程可以同时写入同一个FIFO,但可能导致数据交错
- 删除FIFO文件使用普通的
rm命令
相关命令
mknod:创建特殊文件(包括FIFO)pipe:创建匿名管道socat:更强大的网络和进程间通信工具