为什么 mkfifo 的行为类似于 LIFO?

为什么 mkfifo 的行为类似于 LIFO?

如果我做。

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_ONLYRD_WR

openecho two.

因此,此时您more /tmp/a已经准备好启动两个进程,它们还没有打开 fifo,更不用说向其中写入任何内容了。这两个中的哪一个将被安排,一旦more安排open(RD_ONLY)将是随机的。

为了避免阻塞,你可以这样做:

exec 3<>  /tmp/a

首先解锁管道,然后运行命令,直到管道已满为止,这些命令不会阻塞。

但请注意,上述内容适用于 Linux,但不适用于所有 Unix 或类 Unix。 POSIX 未指定以读写模式打开管道时的行为。

相关内容