我是 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 7<>$tmp_file
事实并非如此。 该
exec
命令打开 $tmp_file
(解析为 FIFO 的名称)进行读取和写入,并将其保持打开状态,与文件描述符编号 7 相关联(在该脚本的执行中)。
代码示例的其他相关部分是这样的:
echo "msg_A" >$tmp_file # blocks, since pipe is unbuffered and no one is reading from it
...你对此有一点误解。 如果没有 exec
,则阻塞的不是对 FIFO 的
write。 相反,它是 shell 首先尝试打开 FIFO,这发生在
echo
本身的任何部分运行之前。 请参阅 Unix & Linux SE 上的 Linux 命名管道:不像想象的那样 FIFO。 (虽然这个问题专门询问 Linux,但所描述的 FIFO 语义在 Unix 系列操作系统中非常常见。)
在exec
打开 FIFO 进行读取和写入之后,直到该文件描述符关闭为止,任何具有足够权限的进程都可以打开 FIFO 进行读取或写入,而不会阻塞。