Linux中退出狀態和SIGCHLD
有什麼區別?wait()SIGCHLD和退出狀態
孩子終止後,會發送一個SIGCHLD
信號來激活父母(被wait()
阻止),那麼爲什麼我們需要孩子的退出狀態?我找不到SIGCHLD
和退出狀態之間的鏈接。
Linux中退出狀態和SIGCHLD
有什麼區別?wait()SIGCHLD和退出狀態
孩子終止後,會發送一個SIGCHLD
信號來激活父母(被wait()
阻止),那麼爲什麼我們需要孩子的退出狀態?我找不到SIGCHLD
和退出狀態之間的鏈接。
子進程的退出狀態是它通過系統調用exit()
(或_exit()
)返回到父進程的值。這是一個簡單的整數,通常表示子進程的成功或失敗,其中零表示成功(按慣例)。
SIGCHLD是孩子終止時發送給父進程的信號。它只是通知等待的父母該孩子已經終止。
兩者的組合用於將子進程的執行結果傳回給其父進程。當孩子退出時,信號告訴父母,退出狀態告訴父母孩子的執行結果。家長在收到信號(或從wait()
或waitpid()
返回)之前無法檢索孩子的退出狀態,表明孩子已退出。
孩子可以通過幾種方式(各種IPC機制,文件I/O等等)將其執行結果傳回給它的父代,但最簡單的方法是使用exit()
和wait()
將子狀態碼家長。
如果父進程不關心子執行狀態是什麼,它可以簡單地忽略從wait()
返回的子進程退出碼。另一方面,爲了重新啓動(fork()
)子進程的新實例,或者如果子進程完成(或不完成),可能需要執行一些其他程序,複雜系統可能需要知道退出狀態是什麼它的任務正確。
非常感謝你先生,現在我明白了信號和退出狀態的組合。 – arctic
退出狀態由進程(通過調用exit
)返回以告知其父級是否成功。
當父進程調用wait
或waitpid
時,它會收到退出狀態(並且在waitpid
的情況下,該孩子的pid),並且可以根據該值做出決定。
如果父母收到SIGCHLD
信號,則告訴過程的所有信息都是其子過程之一完成。它不會向父母提供有關孩子的pid或退出狀態的任何信息。這是一種異步告訴家長的方式,是時候撥打wait
或waitpid
。
謝謝先生,所以信號是給予「去」父母通過等待獲得孩子的退出狀態。 – arctic
[父進程如何通過調用\ _exit的子進程的等待來獲得終止狀態(http://stackoverflow.com/q/6749475)。另請參閱[捕獲子進程的退出狀態代碼](http://stackoverflow.com/q/27306764)和[如果我只是使用wait()等待1個子進程,我是否需要對SIGCHLD處理程序執行任何操作一次完成?](http://stackoverflow.com/q/18437779) – jww