You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何‘exec 7<>$tmp_file’能让命名管道写入非阻塞?

Bash FIFO管道与exec 7<>$tmp_file的疑问解答

问题背景

我是bash脚本编程新手,正在理解以下两段代码:

第一段代码(写入会阻塞)

tmp_file=/tmp/tmp_file$$
mkfifo $tmp_file
echo "msg_A" >$tmp_file # 会阻塞,因为管道无缓冲且无读取端
read msg <$tmp_file
echo $msg

第二段代码(写入不再阻塞)

tmp_file=/tmp/tmp_file$$
mkfifo $tmp_file

exec 7<>$tmp_file # 添加此行

echo "msg_A" >$tmp_file # 现在写入操作不再阻塞,原因是什么?
read msg <$tmp_file
echo $msg  # 输出msg_A

我想了解上述代码中exec 7<>$tmp_file的作用,以及为何添加该行后写入操作变为非阻塞?


解答

exec 7<>$tmp_file的具体作用

这条命令是让bash进程用自定义文件描述符7,以双向读写模式打开指定的FIFO管道:

  • <>是bash的特殊语法,表示同时打开文件的读和写权限
  • 数字7是未被系统默认占用的文件描述符(系统默认用0、1、2分别表示标准输入、标准输出、标准错误)
  • 执行后,bash会持续保持这个FIFO的读端和写端处于打开状态,除非你用exec 7>&-显式关闭这个描述符

写入操作不再阻塞的原因

FIFO管道的核心规则是:必须同时存在打开的读端和写端,读写操作才能正常进行,否则会阻塞。

  • 第一段代码里,执行echo "msg_A" >$tmp_file时,只打开了FIFO的写端,但此时没有任何进程打开读端,bash会强制阻塞这个写入操作,等待读端被打开。但问题是,阻塞的写入会卡住脚本,后面的read命令根本没机会执行,最终脚本彻底停住。
  • 第二段代码中,exec 7<>$tmp_file提前打开了FIFO的读端和写端,相当于给管道“留了口子”。此时再执行写入操作时,管道的读端已经处于打开状态,满足了FIFO的运行条件,写入就能立即完成,不会阻塞,后续的read也能顺利读到内容。

内容的提问来源于stack exchange,提问作者konchy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:02:09