APUE:進程:wait、waitpid

在fork()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成爲殭屍進程,無法正常結束,此時即使是root身份kill -9也不能殺死殭屍進程。補救辦法是殺死殭屍進程的父進程(殭屍進程的父進程必然存在),殭屍進程成爲”孤兒進程”,過繼給1號進程init,init始終會負責清理殭屍進程。


 殭屍進程的產生和避免

解決方法:
1.設置SIGCLD信號爲SIG_IGN,系統將不產生僵死進程。
2.用兩次fork(),而且使緊跟的子進程直接退出,使得孫子進程成爲孤兒進程,從而init進程將負責清除這個孤兒進程。

3.安裝SIGCHLD信號處理函數調用wait()或waitpid()等待子進程結束。

4.在父進程調用wait函數等待子進程的退出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章