1 signal處理僵尸進程的基于語法
利用信號signal處理僵尸進程的方法:signal(SIGCHLD,SIG_IGN),該方法也是第三種處理僵尸進程的方法。
SIGCHLD:子進程狀態改變后產生此信號,父進程需要調用一個wait函數以確定發生了什么。
?
1)SIG_IGN:信號被無視(ignore)或忽略,在該狀態下,調用進程的子進程將不產生僵尸進程。
? ? 該種模式下的子進程狀態信息會被丟棄,也就是自動回收,所以不會產生僵尸進程,但問題也就來了,若調用wait、waitpid函數時無法捕捉到子進程狀態信息了,也就會阻塞到所有的子進程結束;并返回錯誤ECHILD,也就是沒有子進程等待。
2)SIG_DFL:進程采用默認(default)行為處理,而默認的處理方式是不理會該信號,但也不會丟棄子進程的狀態,所以此時不用wait、waitpid對其子進程進行狀態信息回收,則會產生僵尸進程。
2?unix中僵尸進程的含義
凡是父進程沒有調用wait函數獲得子進程終止狀態的子進程在終止之后都是僵尸進程,在這個概念中關鍵一點就是父進程是否調用了wait函數。
3?SIGCHLD信號
簡單地說,子進程退出時父進程會收到一個SIGCHLD信號,默認的處理方式是忽略該信號,而常規的做法是在這個信號處理函數中調用wait函數獲取子進程的退出狀態。
4、既然在SIGCHLD信號的處理函數中要調用wait函數族,為什么有了wait函數族還需要使用SIGCHLD信號?
unix中的信號處理是采用異步處理機制;
一般而言,父進程在生成子進程之后會有兩種情況:一是父進程完成自己的任務,二是父進程不做任務,一直在wait子進程退出。
SIGCHLD信號就是為第一種情況準備的,它讓父進程去做別的任務,而只要父進程注冊了處理該信號的函數,在子進程退出時就會調用該函數,在函數中wait子進程得到終止狀態之后再繼續做父進程的事情。
?注:
1)凡父進程不調用wait函數族獲得子進程終止狀態的條件下,子進程在退出時都會變成僵尸進程
2)SIGCHLD信號可以異步通知父進程有子進程退出。
?
參考:
signal(SIGCLD,SIG_IGN)
linux下的僵尸進程處理SIGCHLD信號
?