2017-01-09 117 views
1

Linux中退出狀態和SIGCHLD有什麼區別?wait()SIGCHLD和退出狀態

孩子終止後,會發送一個SIGCHLD信號來激活父母(被wait()阻止),那麼爲什麼我們需要孩子的退出狀態?我找不到SIGCHLD和退出狀態之間的鏈接。

+0

[父進程如何通過調用\ _exit的子進程的等待來獲得終止狀態(http://stackoverflow.com/q/6749475)。另請參閱[捕獲子進程的退出狀態代碼](http://stackoverflow.com/q/27306764)和[如果我只是使用wait()等待1個子進程,我是否需要對SIGCHLD處理程序執行任何操作一次完成?](http://stackoverflow.com/q/18437779) – jww

回答

4

子進程的退出狀態是它通過系統調用exit()(或_exit())返回到父進程的值。這是一個簡單的整數,通常表示子進程的成功或失敗,其中零表示成功(按慣例)。

SIGCHLD是孩子終止時發送給父進程的信號。它只是通知等待的父母該孩子已經終止。

兩者的組合用於將子進程的執行結果傳回給其父進程。當孩子退出時,信號告訴父母,退出狀態告訴父母孩子的執行結果。家長在收到信號(或從wait()waitpid()返回)之前無法檢索孩子的退出狀態,表明孩子已退出。

孩子可以通過幾種方式(各種IPC機制,文件I/O等等)將其執行結果傳回給它的父代,但最簡單的方法是使用exit()wait()將子狀態碼家長。

如果父進程不關心子執行狀態是什麼,它可以簡單地忽略從wait()返回的子進程退出碼。另一方面,爲了重新啓動(fork())子進程的新實例,或者如果子進程完成(或不完成),可能需要執行一些其他程序,複雜系統可能需要知道退出狀態是什麼它的任務正確。

+0

非常感謝你先生,現在我明白了信號和退出狀態的組合。 – arctic

3

退出狀態由進程(通過調用exit)返回以告知其父級是否成功。

當父進程調用waitwaitpid時,它會收到退出狀態(並且在waitpid的情況下,該孩子的pid),並且可以根據該值做出決定。

如果父母收到SIGCHLD信號,則告訴過程的所有信息都是其子過程之一完成。它不會向父母提供有關孩子的pid或退出狀態的任何信息。這是一種異步告訴家長的方式,是時候撥打waitwaitpid

+0

謝謝先生,所以信號是給予「去」父母通過等待獲得孩子的退出狀態。 – arctic