1. 殭屍程序產生原因:
殭屍程序是當子程序比父程序先結束,而父程序又沒有**子程序,釋放子程序占用的資源,此時子程序將成為乙個殭屍程序。如果父程序先退出 ,子程序被init接管,子程序退出後init會**其占用的相關資源
當乙個程序建立了乙個子程序時,他們的執行是非同步的。即父程序無法預知子程序會在什麼時候結束,那麼如果父程序很繁忙來不及wait 子程序時,那麼當子程序結束時,會丟失子程序的結束時的狀態資訊,處於這種考慮unix提供了一種機制可以保證只要父程序想知道子程序結束時的資訊,它就可以得到。
這種機制是:在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體。但是仍然保留了一些資訊,留下乙個稱為殭屍程序(zombie)的資料結構(如程序號pid 退出狀態 執行時間等)。這些保留的資訊直到程序通過呼叫wait/waitpid時才會釋放。這樣就導致了乙個問題,如果沒有呼叫wait/waitpid的話,那麼保留的資訊就不會釋放。
2.程序結束後為什麼要進入殭屍狀態?
因為父程序可能需要子程序的退出狀態等資訊。
3.殭屍程序會帶來什麼危害?
因此少量的殭屍程序不會帶來很大的危害。
4.殭屍程序是每個子程序必經的狀態嗎?
是的。 任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時 處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。
5.如何處理殭屍程序?
(1)正常情況下,需要父程序來「收屍」,但是如果父程序fork()之前既沒安裝sigchld訊號處理函式呼叫waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為殭屍程序後,該殭屍程序無法正常結束,即使是root身份kill -9也不能殺死殭屍程序;
(2)此時如果殭屍程序的父程序會自動結束那麼殭屍程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理殭屍程序;
(3)如果不能自動結束(比如是個迴圈,不會結束),此時子程序會一直保持殭屍狀態,這種情況下只能通過強制殺死父程序的方式消除殭屍程序。
殭屍程序的產生原因
在linux系統中,殭屍程序是已經執行完畢,但是沒有被父程序 的子程序。判斷殭屍程序的乙個方法是使用ps命令檢視程序狀態。如果程序狀態是z,說明這是乙個殭屍程序。在多程序的程式中,父程序會啟動若干個子程序來處理任務。當子程序退出後,除了在程序表中占用的乙個程序表項,子程序所使用的資源 檔案描述符 記...
mysql殭屍程序 殭屍程序產生原因和解決方法
在linux系統中,當用ps命令觀察程序的執行狀態時,經常看到某些程序的狀態列為defunct,這就是所謂的 殭屍 程序。殭屍 程序是乙個早已死亡的程序,但在程序表 processs table 中仍佔了乙個位置 slot 由於程序表的容量是有限的,所以,defunct程序不僅占用系統的記憶體資源,...
殭屍程序的產生原因和避免方法
殭屍程序的產生 當乙個程序建立了乙個子程序時,他們的執行時非同步的。即父程序無法預知子程序會在什麼時候結束,那麼如果父程序很繁忙來不及wait 子程序時,那麼當子程序結束時,會不會丟失子程序的結束時的狀態資訊呢?處於這種考慮unix提供了一種機制可以保證只要父程序想知道子程序結束時的資訊,它就可以得...