为什么 mkfifo 表现得像 LIFO?

sle*_*eax 8 scheduling pipe

如果我做。

mkfifo /tmp/a
echo 'one'>/tmp/a
Run Code Online (Sandbox Code Playgroud)

在另一个终端的同时

echo 'two'>/tmp/a
Run Code Online (Sandbox Code Playgroud)

从第三个终端

more /tmp/a
Run Code Online (Sandbox Code Playgroud)

为什么我获得作为最后一个命令的输出?

two
one
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 9

echo 'one' > /tmp/a
Run Code Online (Sandbox Code Playgroud)

外壳open(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
Run Code Online (Sandbox Code Playgroud)

首先解锁管道,然后运行您的命令,直到管道已满时才会阻塞。

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