使用Fork(),进程树看起来像什么?

时间:2013-03-03 21:21:21

标签: c fork conceptual

比如说,我们在shell中执行了以下操作:

ls | grep "abc" | wc

我理解子进程如何从shell中派生出来以及它是一个孩子,就像这样,

Shell (pid=12)
       \
        \
         ls (pid=13)

但是我不确定管道和尾随命令是如何适应的。它们也是shell的子项,而不是ls吗?

1 个答案:

答案 0 :(得分:2)

管道的每个组件都是shell的子进程。如果您使用其他终端的pstree -p,您可能会看到如下内容:

...
sshd(11)---bash(12)-+-ls(13)
                    |-grep(14)
                    \-wc(15)
...

(假设你可以在你的管道仍在运行的情况下运行它!)

但请注意,所有组件都会形成一个process group

管道本身是Linux(或您正在使用的任何操作系统)的一项功能,它不是一个单独的用户进程。 shell创建了一些anonymous pipes,并将它们连接到管道中每对进程的相关文件描述符。