早就了解孤兒進程與僵屍進程,但僅僅是停留在一知半解的程度,總結一下。
僵屍進程:父進程創建了子進程,若子進程退出,但是父進程並沒有調用wait()或者waitpid()獲取子進程的狀態,那麼子進程的進程描述符就仍然保存在系統中。這些進程稱為僵屍進程。
孤兒進程沒有父進程來回收,重任就交給了init進程上,在孤兒進程結束後init會作為父進程進行回收,所以孤兒進程一般沒有什麼危害。
解決辦法一:
父進程主動接收並處理SIGCHILD信號,在信號處理函數中調用wait()函數進程處理。
[code]int main() { ... Signal(SIGCHLD, sig_chld); ... } void sig_chld(int signo) { pid_t pid; int stat; while ( (pid = waitpid(-1, &stat, WNOHANG)) >0) printf("child %d terminated/n", pid); }解決辦法二:
fork兩次,父進程(成為進程a)創建子進程(進程b),然後子進程再創建子進程(進程c),同時進程b退出且父進程回收,這時進程c變成孤兒進程,從而其父進程變成init進程,通過init進程就能處理僵屍進程。