2
說,例如,我們有如下的shell中執行:什麼是進程樹看起來像使用fork()?
ls | grep "abc" | wc
我瞭解一個子進程會從殼叉子和如何它的一個孩子,這樣,
Shell (pid=12)
\
\
ls (pid=13)
但我不確定管道和尾隨命令是如何適合的。他們是否也是殼的子,而不是ls
?
說,例如,我們有如下的shell中執行:什麼是進程樹看起來像使用fork()?
ls | grep "abc" | wc
我瞭解一個子進程會從殼叉子和如何它的一個孩子,這樣,
Shell (pid=12)
\
\
ls (pid=13)
但我不確定管道和尾隨命令是如何適合的。他們是否也是殼的子,而不是ls
?
管道的每個組件都將是shell的子進程。如果您使用pstree -p
從另一個終端,你可能會看到這樣的內容:
...
sshd(11)---bash(12)-+-ls(13)
|-grep(14)
\-wc(15)
...
(!假設你可以同時您的管道仍在運行運行此)
但是請注意,所有的組件會形成單一的process group。
管道本身是Linux的一個功能(或者你正在使用的任何操作系統),它不是一個單獨的用戶進程。 shell創建一些anonymous pipes,並將它們連接到流水線中每對進程的相關文件描述符。
感謝您的幫助傢伙! – 2013-03-03 21:46:37
您是否熟悉'pstree'工具? – 2013-03-03 21:22:38
對於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