Ste*_*n D 14

psbash列为正在运行的进程,因为 bash 进程/tmp/in2在生成cat命令之前尝试打开 fifo 被阻止。由于bash负责处理您的redirect( > /tmp/in2),它必须首先打开,/tmp/in2以便稍后可以使用dup2系统调用STDOUTcat命令的更改为 的文件描述符/tmp/in2。不幸的是,open在这种情况下,调用被阻塞。

如果您要在 strace 中运行命令:

strace -f bash -c "cat /tmp/out1 > /tmp/in2"
Run Code Online (Sandbox Code Playgroud)

你会看到它停在:

[pid 18457] open("/tmp/in2", O_WRONLY|O_CREAT|O_TRUNC, 0666
Run Code Online (Sandbox Code Playgroud)

它被阻止,直到另一个进程打开文件进行读取。根据fifo(7)手册页:

内核为至少一个进程打开的每个 FIFO 特殊文件维护一个管道对象。FIFO 必须在两端(读和写)都打开,然后才能传递数据。通常,打开 FIFO 会阻塞,直到另一端也打开。

进程可以在非阻塞模式下打开 FIFO。在这种情况下,即使没有人在写端打开,只读打开也会成功,除非另一端已经打开,否则只打开写将失败并显示 ENXIO(没有这样的设备或地址)。

如果您/tmp/in2要先打开以供阅读(比如cat /tmp/in2 &在您的最终 cat 命令之前添加),您会看到您的最终cat命令显示在您的进程树中。