2015-06-01 48 views
1

我想知道這個問題:誰在等待shell後臺進程?

如果我在bash鍵入以下命令

#睡眠100 &

殼怎麼會知道等待它結束?

當shell爲了執行睡眠命令而自行分支時,是不是ampersand在技術上意味着它不會等待那個新分叉的進程? 儘管如此,它仍然等待它(不然我也見過它作爲一個殭屍,我不)

感到困惑在這裏:\

+1

因爲它保留了正在運行的作業列表。 –

+0

不太明白這是什麼意思.. 它有什麼不同? – user1384377

+3

當你從學校去接你的孩子時,是什麼讓你無法開車去學校,等待15秒,然後開走? **你知道你有多少孩子,還有多少人還沒有進入車子。** –

回答

2

外殼得到一個SIGCHLD其子進程退出的時候;因此,它可以立即在信號處理程序中調用wait4()來獲得它。

如果運行strace bash,你將看到類似以下內容:

--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=13708, si_status=0, si_utime=0, si_stime=0} --- 
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG, NULL) = 13708 
wait4(-1, 0x7fffbca63110, WNOHANG, NULL) = -1 ECHILD (No child processes) 

也就是說:外殼得到一個信號,一個子進程退出;它會在沒有PID的情況下調用wait4(),從而從流程表中收集第一個死亡孩子;並再次打電話通知,並通知沒有死亡的孩子仍有待收割。

這與在前臺運行進程的情況不同,其中阻止wait()立即運行。

+0

我明白了,它完美地完成了!謝謝! – user1384377