2013-03-03 73 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

相關問題