如果我做。
mkfifo /tmp/a
echo 'one'>/tmp/a
一会儿从另一个终端
echo 'two'>/tmp/a
从第三个航站楼
more /tmp/a
为什么我得到最后一个命令的输出?
two
one
答案1
在
echo 'one' > /tmp/a
shellopen(O_WRONLY)
在管道上执行 an 操作,然后生成echo
,然后执行write("one\n")
.
它将阻塞,open
直到其他进程打开管道。RD_ONLY
RD_WR
您open
的echo two
.
因此,此时您more /tmp/a
已经准备好启动两个进程,它们还没有打开 fifo,更不用说向其中写入任何内容了。这两个中的哪一个将被安排,一旦more
安排open(RD_ONLY)
将是随机的。
为了避免阻塞,你可以这样做:
exec 3<> /tmp/a
首先解锁管道,然后运行命令,直到管道已满为止,这些命令不会阻塞。
但请注意,上述内容适用于 Linux,但不适用于所有 Unix 或类 Unix。 POSIX 未指定以读写模式打开管道时的行为。