我們有這樣乙個問題:孤兒程序和殭屍程序,怎麼產生的?有什麼危害?怎麼去預防?
下面是針對此問題的總結與概括。
正常情況下:子程序由父程序建立,子程序再建立新的程序。父子程序是乙個非同步過程,父程序永遠無法**子程序的結束,所以,當子程序結束後,它的父程序會呼叫wait()或waitpid()取得子程序的終止狀態,**掉子程序的資源。
孤兒程序:父程序結束了,而它的乙個或多個子程序還在執行,那麼這些子程序就成為孤兒程序(father died)。子程序的資源由init程序(程序號pid = 1)**。
殭屍程序:子程序退出了,但是父程序沒有用wait或waitpid去獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中,這種程序稱為僵死程序。
注意:unix提供了一種機制保證父程序知道子程序結束時的狀態資訊
這種機制是:在每個程序退出的時候,核心會釋放所有的資源,包括開啟的檔案,占用的記憶體等。但是仍保留一部分資訊(程序號pid,退出狀態,執行時間等)。直到父程序通過wait或waitpid來取時才釋放。
但是這樣就會產生問題:如果父程序不呼叫wait或waitpid的話,那麼保留的資訊就不會被釋放,其程序號就會被一直占用,但是系統所能使用的程序號是有限的,如果大量產生僵死程序,將因沒有可用的程序號而導致系統無法產生新的程序,這就是殭屍程序的危害
孤兒程序是沒有父程序的程序,它由init程序迴圈的wait()**資源,init程序充當父程序。因此孤兒程序並沒有什麼危害。
補充:任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序的資料結構,等待父程序去處理。如果父程序在子程序exit()之後,沒有及時處理,出現殭屍程序,並可以用ps命令去檢視,它的狀態是「z」。
嚴格的說,殭屍程序並不是問題的根源,罪魁禍首是產生大量僵死程序的父程序。因此,我們可以直接除掉元凶,通過kill傳送sigterm或者sigkill訊號。元凶死後,殭屍程序程序變成孤兒程序,由init充當父程序,並**資源。
或者執行:kill -9 父程序的pid值、
父程序通過wait或waitpid等函式去等待子程序結束,但是不好,會導致父程序一直等待被掛起,相當於乙個程序在幹活,沒有起到多程序的作用。
通過訊號機制,子程序退出時向父程序傳送sigchld訊號,父程序呼叫signal(sigchld,sig_child)去處理sigchld訊號,在訊號處理函式sig_child()中呼叫wait進行處理殭屍程序。什麼時候得到子程序訊號,什麼時候進行訊號處理,父程序可以繼續幹其他活,不用去阻塞等待。
孤兒程序 殭屍程序
殭屍程序和孤兒程序 殭屍程序 殭屍程序是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序的退出碼,就會產生殭屍程序,殭屍程序會一直儲存在程序表中,並且一直等待父程序讀取退出狀態碼。所以,只要子程序退出,父程序還在執行,但是父程序沒有讀取到子程序的狀態,子程序就會進入殭屍狀態。建立乙個殭屍程序...
殭屍程序, 孤兒程序
一,定義 當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 簡單來說就是,在父程序中有乙個子程序,該子程序完成父程序交給的任務,子程序完成後會給父程序乙個任務結果返回,但父程序一直沒有...
殭屍程序 孤兒程序
程序在之前分為3個狀態 1.執行狀態 running 正在cpu中執行的程序。2.就緒狀態 ready 已獲得除了處理器外的所需資源,隨時準備著執行的程序。3.阻塞狀態 blocked 因為缺少除了cpu外的其他資源,無法滿足執行條件的程序。殭屍程序 乙個程序使用fork建立子程序,如果子程序退出,...