父子程序 孤兒程序 殭屍程序小小總結

2021-10-07 21:59:28 字數 1075 閱讀 9327

unix/linux中,子程序通過父程序建立。子程序的結束和父程序的執行是非同步狀態,在乙個程序工作終止後他的父程序需要呼叫wait或waitpid系統呼叫取得子程序的終止狀態。

:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼這些子程序將成為孤兒程序。孤兒程序將位init程序(pid=1)收養,並有init程序對他們進行狀態的收集工作

孤兒程序的收集任務交由init程序處理,每當出現孤兒程序,核心將孤兒程序的父程序設定為init程序, init程序會迴圈wait他的子程序。因此孤兒程序沒有什麼危害。

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

unix在每個程序退出的時候核心釋放該程序所有資源,包括開啟的檔案占用的記憶體等,但是仍然保留一定資訊如程序號,退出狀態,執行時間等直到父程序通過wait/waitpid來獲取時釋放。若父程序不呼叫wait/waitpid,那麼保留的資訊不回釋放,程序號會被一直占用,系統能使用的程序號是有限的,產生大量僵死程序將導致因沒有可用的程序號導致系統不能產生新的程序。

解決系統產生大量僵死程序的方式是將產生大量僵死程序的父程序kill掉, 通過kill傳送sigtrem或者sigkill訊號。kill掉父程序後,僵死程序就變成了孤兒程序,這些程序會被init程序接管,init程序會wait這些孤兒程序釋放他們占用的系統程序表中的資源。

避免產生殭屍程序:一般為了防止產生殭屍程序,在fork子程序之後要wait子程序,同時子程序退出的時候核心會給父程序乙個sigchld訊號,可以在父程序建立乙個捕獲sigchld訊號的訊號處理函式,在函式體中呼叫wait/waitpid,就可以清理退出的子程序防止產生殭屍程序。

問題:在不會sigchld訊號呼叫wait清理退出程序仍然不能徹底避免產生殭屍程序。unix訊號一般是不排隊的,有多個sigchld訊號在訊號處理函式執行之前產生那麼訊號處理函式僅執行一次。正確的解決辦法是:呼叫waitpid而不是wait,在訊號處理函式中在乙個迴圈內呼叫waitpid以獲取所有已終止子程序的狀態。指定wnohang選項,使waitpid在有尚未終止的子程序時非阻塞。(wait不行,會阻塞到現有的子程序中第乙個終止為止)。

孤兒程序 殭屍程序

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

殭屍程序, 孤兒程序

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

殭屍程序 孤兒程序

程序在之前分為3個狀態 1.執行狀態 running 正在cpu中執行的程序。2.就緒狀態 ready 已獲得除了處理器外的所需資源,隨時準備著執行的程序。3.阻塞狀態 blocked 因為缺少除了cpu外的其他資源,無法滿足執行條件的程序。殭屍程序 乙個程序使用fork建立子程序,如果子程序退出,...