孤兒程序是指在程序還未退出之前它的父程序就已經先退出了,簡單來說就是乙個沒有父程序的子程序就是孤兒程序。既然所有的程序都必須在退出之後被父程序的wait()或waitpid()以釋放其遺留在系統中的一些資源,那麼孤兒程序的這些東西又誰來處理呢?這個任務就落到了init程序的身上,init程序就好像乙個收納所,每當核心發現乙個孤兒程序,就會把孤兒程序的父程序設定為init,而init程序會迴圈地wait()它的已經退出的子程序。所以這樣看來孤兒程序並不會危害系統的執行。
linux程序模型中,程序是按照父程序產生子程序,子程序再產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作,終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態。但是如果父程序沒有這樣做的話會產生什麼後果呢?此時,子程序雖然已經退出了,但是在系統程序表中還未它保留了一些退出狀態資訊,如果父程序沒有這麼做的話會產生什麼後果呢?
如果子程序在沒有被父程序的wait()和waitpid()呼叫的情況下退出,那麼子程序的退出狀態資訊就會一直占用著程序狀態表的表項,這個時候這些程序就被稱為殭屍程序。
如下**fork()了乙個子程序根據子程序fork中返回0,父程序中fork返回子程序pid的特性,使子程序很快就退出了,而父程序一直處於sleep狀態,這樣就產生了殭屍程序。
#include
#include
int main()
}else
if(pid == 0)
}
這裡使用ps指令檢視程序狀態如圖所示,可以看成11943號程序狀態為z,代表它就是乙個殭屍程序
系統程序表是一項有限資源,如果系統程序表被殭屍程序耗盡的話,系統就可能無法建立新的程序。
例如有這樣乙個父程序,它定期會產生乙個子程序,這個子程序的生命週期比較短,執行不了多久就會退出,而父程序會不斷的產生新的子程序,確又不在程序退出之後對其退出狀態進行處理,那麼系統執行上一段時間之後就會出現很多的殭屍程序,導致無法建立新的程序。那麼我們如何處理這些殭屍程序呢?
其實這裡問題的根源不是這些殭屍程序自身,而是不斷產生這些殭屍程序的父程序,所以我們的解決方案就是殺死這個父程序。當我們殺掉這個父程序之後,他產生的這些殭屍程序就會變成孤兒程序,而孤兒程序又會被init的wait()釋放退出狀態資訊。這樣就解決了殭屍程序占用系統程序表的問題了。當然這是不得已而為之的方法,最好是在**中就對其進行控制,防止殭屍程序的產生。
殭屍程序與孤兒程序
殭屍程序 如果乙個程序通過fork 建立子了乙個程序,當子程序退出而父程序還沒有呼叫wait waitpid來儲存子程序的狀態且 它,此時子程序的狀態描述資訊仍然保留在系統中,稱這類程序為殭屍程序 殭屍程序的優點是方便上層程序得知子程序的退出狀態,但是如果不及時 會造成記憶體洩露 孤兒程序 當乙個父...
殭屍程序與孤兒程序
在父程序執行wait 之前,其子程序就已終止,即使子程序終止,系統也允許父程序在以後的某個時刻去執行wait 以確定子程序是如何終止。核心通過將子程序轉為殭屍程序,以釋放其占用的系統資源,供其他程序使用,該程序唯一保留的是系統pcb中的一條記錄,其中包含了子程序的id,終止狀態,和資源使用的資料。當...
殭屍程序與孤兒程序
unix linux中,正常情況下,子程序是通過父程序建立的,子程序再建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法 子程序到底什麼時候結束。當乙個 程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取得子程序的終止狀態。unix提供了一種...