我是 Bash 脚本编程的新手,我正在尝试理解以下代码:
tmp_file=/tmp/tmp_file$$
mkfifo $tmp_file
echo "msg_A" >$tmp_file # blocks, since pipe is unbuffered and no one is reading from it
read msg <$tmp_file
echo $msg
tmp_file=/tmp/tmp_file$$
mkfifo $tmp_file
exec 7<>$tmp_file # add this line
echo "msg_A" >$tmp_file # now, the write operation won't block, why?
read msg <$tmp_file
echo $msg # msg_A is printed
我想知道exec 7<>$tmp_file
上面的代码示例中做了什么,以及为什么添加此行会使写入操作非阻塞?
事实并非如此。该
exec
命令打开$tmp_file
(解析为 FIFO 的名称)进行读写,并将其保持打开状态,与文件描述符编号 7 相关联(在脚本的执行过程中)。代码示例的另一个相关部分是:
... 并且你对此有一点误解。没有 ,写入FIFO 不会阻塞
exec
。相反,这是 shell首先尝试打开echo
FIFO,这发生在其自身任何部分运行之前。请参阅Linux 命名管道:不像 Unix & Linux SE 上所想的那样 FIFO。(虽然这个问题专门询问 Linux,但所描述的 FIFO 语义在 Unix 系列操作系统中非常常见。)exec
在打开 FIFO 进行读写之后,直到该文件描述符关闭为止,任何具有足够权限的进程都可以打开 FIFO 进行读写而不会发生阻塞。