遇到信號量的問題?函數
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在配置信號處理方式時,是不會當即檢查是否有子進程準備好被扽帶,也不會在此時調用信號處理函數。