为什么“exec 7<>$tmp_file”使命名管道写入非阻塞?

问题描述 投票:0回答:1

我是 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
做了什么,为什么添加这一行使得写操作成为非阻塞?

bash named-pipes
1个回答
0
投票

我想知道上面代码示例中的

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 进行读取或写入,而不会阻塞。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.