孤兒程序VS殭屍程序

2022-05-08 11:24:10 字數 2115 閱讀 5314

我們知道在unix/linux中,正常情況下,子程序是通過父程序建立的,子程序在建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序 到底什麼時候結束。 當乙個 程序完成它的工作終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。孤兒程序和殭屍程序都是對不正常狀態的子程序的稱呼,區別如下:

乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

由於孤兒程序會被init程序給收養,所以孤兒程序不會對系統造成危害

乙個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。

僵死程序的危害:

unix提供了一種機制可以保證只要父程序想知道子程序結束時的狀態資訊, 就可以得到。這種機制就是: 在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。 但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放。 但這樣就導致了問題,如果程序不呼叫wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。

任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個 子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時 處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。 如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對殭屍狀態的子程序進行處理。

乙個程序如果只複製fork子程序而不負責對子程序進行wait()或是waitpid()呼叫來釋放其所占有資源的話,那麼就會產生很多的僵死程序,如果要消滅系統中大量的僵死程序,只需要將其父程序殺死,此時所有的僵死程序就會變成孤兒程序,從而被init所收養,這樣init就會釋放所有的僵死程序所占有的資源,從而結束僵死程序。

下面我們用乙個小程式來演示如何製造乙個孤兒程序和乙個殭屍程序。正常而正確的程序如下:

#include #include 

#include

#include

#include

main()

else

}

以上**中父程序等待子程序退出後父程序自己再退出,檢視程序列表沒有任何異常。我們來修改下讓父程序早於子程序退出: 

#include #include 

#include

#include

#include

main()

else

}

以上程式讓子程序延遲120秒,父程序不等待子程序提前退出,那麼子程序將變成孤兒,並由1號程序收養,待120秒後退出。在120秒內檢視程序列表,54035是程序號,1號是它的父程序號也就是它的養父1號程序。如下所示:

讓我們再來修改下**,讓子程序先退出,父程序不退出但是也不wait子程序,即不對完成執行的子程序**資源,**如下:

#include #include 

#include

#include

#include

main()

else

}

子程序先退出,父程序不退出但是也不wait子程序,即不對完成執行的子程序**資源。那麼這個子程序將變成殭屍程序。檢視程序列表如下

54981是父程序,54982是子程序,可以看出該子程序變成了殭屍程序(defunct process).當父程序結束時,該殭屍程序變成孤兒程序將由1號程序接管並**資源。

殭屍程序vs孤兒程序

殭屍程序 殭屍狀態 zombies 是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序退出的返回 時就會產生殭屍程序 殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態碼 所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態。來建立乙個維持3...

孤兒程序 殭屍程序

殭屍程序和孤兒程序 殭屍程序 殭屍程序是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序的退出碼,就會產生殭屍程序,殭屍程序會一直儲存在程序表中,並且一直等待父程序讀取退出狀態碼。所以,只要子程序退出,父程序還在執行,但是父程序沒有讀取到子程序的狀態,子程序就會進入殭屍狀態。建立乙個殭屍程序...

殭屍程序, 孤兒程序

一,定義 當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 簡單來說就是,在父程序中有乙個子程序,該子程序完成父程序交給的任務,子程序完成後會給父程序乙個任務結果返回,但父程序一直沒有...