我想知道這個問題:誰在等待shell後臺進程?
如果我在bash鍵入以下命令
#睡眠100 &
殼怎麼會知道等待它結束?
當shell爲了執行睡眠命令而自行分支時,是不是ampersand在技術上意味着它不會等待那個新分叉的進程? 儘管如此,它仍然等待它(不然我也見過它作爲一個殭屍,我不)
感到困惑在這裏:\
我想知道這個問題:誰在等待shell後臺進程?
如果我在bash鍵入以下命令
#睡眠100 &
殼怎麼會知道等待它結束?
當shell爲了執行睡眠命令而自行分支時,是不是ampersand在技術上意味着它不會等待那個新分叉的進程? 儘管如此,它仍然等待它(不然我也見過它作爲一個殭屍,我不)
感到困惑在這裏:\
外殼得到一個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()
立即運行。
我明白了,它完美地完成了!謝謝! – user1384377
因爲它保留了正在運行的作業列表。 –
不太明白這是什麼意思.. 它有什麼不同? – user1384377
當你從學校去接你的孩子時,是什麼讓你無法開車去學校,等待15秒,然後開走? **你知道你有多少孩子,還有多少人還沒有進入車子。** –