天天看點

原因以及如何避免産生僵屍程序

假設子程序的父程序退出, 同時,他們沒叫父程序wait/waitpid。子程序将成為僵屍程序。

經ps指令,我們可以看到的過程的狀态Z(他代表死亡)。

一般。為了防止産生僵屍程序。在fork子程序之後我們都要wait它們。同一時候,當子程序退出的時候,核心都會給父程序一個SIGCHLD信号。是以我們能夠建立一個捕獲SIGCHLD信号的信号處理函數,在函數體中調用wait(或waitpid)。就能夠清理退出的子程序以達到防止僵屍程序的目的。

正确的解決的方法是調用waitpid而不是wait。這個辦法的方法為:信号處理函數中,在一個循環内調用waitpid。以擷取全部已終止子程序的狀态。我們必須指定WNOHANG選項。他告知waitpid在有尚未終止的子程序在執行時不要堵塞。(我們不能在循環内調用wait,由于沒有辦法防止wait在尚有未終止的子程序在執行時堵塞,wait将會堵塞到現有的子程序中第一個終止為止)。

符合POSIX的系統信号處理總結:

                1. 一旦安裝了信号處理函數,它便一直安裝者(較早期的系統是每運作一次就将其拆除)。

                2. 在一個信号處理函數執行期間,正被遞交的信号是堵塞的。

                3. 假設一個信号在被堵塞期間産生了一次或多次,那麼該信号被解堵塞之後通常僅僅遞交一次,也就是說Unix信号預設是不排隊的。

                4. 利用sigprocmask函數選擇性地堵塞或解堵塞一組信号是可能的。這使得我們能夠做到在一段臨界區代碼運作期間,防止捕獲某些信号。以此保護這段代碼。

版權聲明:本文部落客原創文章。部落格,未經同意不得轉載。

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/4909499.html,如需轉載請自行聯系原作者

繼續閱讀