#include #include int main()
}else if ( pid == 0 )
}
上述程式中,fork了乙個子程序,並且子程序很快就退出。父程序持續進行sleep,這樣子程序就變成了殭屍程序。利用ps命令可以清晰的看到這一點。
[leconte@localhost ~]$ps axu |greptest
leconte 32600 0.0 0.0 1516 268 pts/1 s+ 20:43 0:00 ./test
leconte 32601 0.0 0.0 0 0 pts/1 z+ 20:43 0:00 [test] leconte 32603 0.0 0.1 5024 668 pts/2 r+ 20:43 0:00 grep test
z+代表程序32601是殭屍程序。
殭屍程序和孤兒程序的區別是,孤兒程序是子程序還在執行,而父程序掛了,子程序被init程序收養。殭屍程序是父程序還在執行但是子程序掛了,但是父程序卻沒有使用wait來清理子程序的程序資訊,導致子程序雖然執行實體已經消失,但是仍然在核心的程序表中佔據一條記錄,這樣長期下去對於系統資源是乙個浪費。
這時候殺掉父程序即可清理該殭屍程序。當然這並非長久之計,根本的辦法是從**上進行控制,防止類似的事情再發生。常見的方法無非是處理父程序的sigchld訊號,在訊號處理函式裡用wait或者waitpid等函式進行處理。更改後的**如下:
#include #include #include void* handler(int sig)}
int main()
}else if ( pid == 0 )
}
這樣更改後執行的輸出如下:
[leconte@localhost test]$ ./test
i die
child is die,i know
可見父程序已經成功地處理了子程序的退出訊號,子程序徹徹底底的消失了。 php多程序防止出現殭屍程序
對於用php進行多程序併發程式設計,不可避免要遇到殭屍程序的問題。殭屍程序是指的父程序已經退出,而該程序dead之後沒有程序接受,就成為殭屍程序 zombie 程序。任何程序在退出前 使用exit退出 都會變成殭屍程序 用於儲存程序的狀態等資訊 然後由init程序接管。如果不及時 殭屍程序,那麼它在...
編寫一unix程式,防止殭屍程序的出現
殭屍程序的避免 父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後,父程序會收到該訊號,可以在handler中呼叫wait 如果 父程序不關心子程序什麼時候結束,那麼可以用sign...
防止殭屍程序的產生
apue的 直接貼這裡。這段 採用了兩次fork,來避免產生殭屍程序。當乙個程序的父程序先退出,該程序就由init程序接管。init程序就成為了該程序的父程序 該程序退出時,有init來清理。所以該程序就不會成為殭屍程序了。include include include include intmai...