殭屍進程和孤兒進程是父進程不調用wait時子進程可能的兩個狀態。編程
殭屍進程:殭屍進程是指子進程結束運行(exit(0)), 系統將會保留子進程的描述符信息(沒有被回收,其餘進程不能夠重用該描述符),而父進程沒有調用wait對退出的子進程進行處理。子進程成爲殭屍進程。查看命令ps打印其state可將有Z標誌。函數
孤兒進程:父進程沒有調用wait等待子進程退出。父進程結束後,子進程仍然在運行,此時子進程成爲孤兒進程。孤兒進程會被init進程捕獲到,並將init進程做爲本身的父進程,此時全部的清除操做將會交給init進程(init進程循環調用wait)。 所以,孤兒進程是無害的。code
解決殭屍進程的編程方法:首先父進程調用signal註冊一個一個信號處理函數處理信號SIGCHILD: signal(SIGCHILD, call_back),call_back中調用wait_pid. 子進程在退出時會發出SIGCHILD,被父進程捕獲後會調用call_back,完成對子進程描述符的回收操做,進程
void call_back(int signo); int main() { signal(SIGCHILD, call_back); int pid = fork(); if(pid==0) { //son thread; exit(0) } else { //father thread; //sleep(100000); }; }