signal(SIGCLD,SIG_IGN)

遇到信號量的問題?函數

 signal(SIGCLD,SIG_IGN)進程

SIGCHLD的語義爲:子進程狀態改變後產生此信號,父進程須要調用一個wait函數以肯定發生了什麼。it

 對於SIGCLD的早期處理方式以下:若是進程特意設置該信號的配置爲SIG_IGN,則調用進程的子進程將不產生僵死進程。配置

 若是將SIGCLD的配置設置爲捕捉,則內核當即檢查是否有子進程準備好被等待,若是是這樣,則調用SIGCLD處理程序。循環

APUE上SIGCLD語義寫的有點不清楚,到底咱們的系統是如何來處理SIGCLD信號呢?
    1.SIG_DFL :默認的處理方式是不理會這個信號,可是也不會丟棄子進行狀態,因此若是不用wait,waitpid程序

對其子進行進行狀態信息回收,會產生殭屍進程。
    2.SIG_IGN :忽略的處理方式,這個方式和默認的忽略是不同的語意,暫且咱們把忽略定義爲SIG_IGN,阻塞

在這種方式下,子進程狀態信息會被丟棄,也就是自動回收了,因此不會產生殭屍進程,可是問題也就來了,內核

wait,waitpid卻沒法捕捉到子進程狀態信息了,若是你隨後調用了wait,那麼會阻塞到全部的子進程結束,並返錯誤

回錯誤ECHILD,也就是沒有子進程等待。
       APUE中P248敘述SIGCHLD若是配置成SIG_IGN也不會產生殭屍進程。是否系統SIG_IGN配置下,對漏洞

SIGCLD,SIGCHLD作出的處理方式是相同的。
   3.自定義處理方式:SIGCLD會當即檢查是否有子進程準好被等待,這即是SIGCLD最大漏洞了,一旦在信號

處理函數中加入了信號處理方式重建的步驟,那麼每次設置SIGCLD處理方式時,都會去檢查是否有信號到來,

若是此時信號的確到來了,先是調用自定義信號處理函數,而後是調用信號處理方式重建函數,在重建配置的

時候,會去檢查信號是否到來,此時信號未被處理,會再次觸發自定義信號處理函數,一直循環。

    因此在處理SIGCLD時,應該先wait處理掉了信號信息後,再進行信號處理方式重建。

   SIGCHLD在配置信號處理方式時,是不會當即檢查是否有子進程準備好被扽帶,也不會在此時調用信號處理函數。

相關文章
相關標籤/搜索