2013-03-03 60 views
2

说,例如,我们有如下的shell中执行:什么是进程树看起来像使用fork()?

ls | grep "abc" | wc 

我了解一个子进程会从壳叉子和如何它的一个孩子,这样,

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

但我不确定管道和尾随命令是如何适合的。他们是否也是壳的子,而不是ls

+1

您是否熟悉'pstree'工具? – 2013-03-03 21:22:38

+0

对于OP:从[**这个代码**](http://www.ladweb.net/src/ladsh4.c.html)得到一个想法,shell是如何实际实现'|'运算符的。在代码中搜索这一行:'if(!(newJob.progs [i] .pid = fork()))然后你知道ls,grep,wc是shell的子进程...代码不是bash代码但Bash做类似.. – 2013-03-03 21:41:08

回答

2

管道的每个组件都将是shell的子进程。如果您使用pstree -p从另一个终端,你可能会看到这样的内容:

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

(!假设你可以同时您的管道仍在运行运行此)

但是请注意,所有的组件会形成单一的process group

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

+0

感谢您的帮助家伙! – 2013-03-03 21:46:37

相关问题