在fork()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成爲殭屍進程,無法正常結束,此時即使是root身份kill -9也不能殺死殭屍進程。補救辦法是殺死殭屍進程的父進程(殭屍進程的父進程必然存在),殭屍進程成爲”孤兒進程”,過繼給1號進程init,init始終會負責清理殭屍進程。
解決方法:
1.設置SIGCLD信號爲SIG_IGN,系統將不產生僵死進程。
2.用兩次fork(),而且使緊跟的子進程直接退出,使得孫子進程成爲孤兒進程,從而init進程將負責清除這個孤兒進程。
3.安裝SIGCHLD信號處理函數調用wait()或waitpid()等待子進程結束。
4.在父進程調用wait函數等待子進程的退出。