如果我做。
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)
在
echo 'one' > /tmp/a
Run Code Online (Sandbox Code Playgroud)
外壳open(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
Run Code Online (Sandbox Code Playgroud)
首先解锁管道,然后运行您的命令,直到管道已满时才会阻塞。
但是请注意,上述内容适用于 Linux,但不适用于所有 Unix 或类 Unix。POSIX 未指定以读写模式打开管道时的行为。
| 归档时间: |
|
| 查看次数: |
1413 次 |
| 最近记录: |