殭屍程序和孤兒程序

2021-09-22 18:03:37 字數 1412 閱讀 8874

一、 殭屍程序

什麼是殭屍程序

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

**實現一下:

#include #include #includeint main()

else if(id > 0)

else

return 0;

}

結果如下:

3. 殭屍程序的危害及解決方法

危害:

如果有大量的殭屍程序駐在系統之中,必然消耗大量的系統資源。但是系統資源是有限的,因此當殭屍程序達到一定數目時,系統因缺乏資源而導致奔潰。

解決方法:

1)殺死殭屍程序的父程序

將其父程序殺死,那麼它的子程序,即殭屍程序會變成孤兒程序,由系統來**。但是這種做法在大多數情況下都是不可取的,如父程序是乙個伺服器程式,如果為了**其子程序的資源,而殺死伺服器程式,那麼將導致整個伺服器崩潰,得不償失。顯然這種**程序的方式是不可取的,但其也有一定的存在意義。

2)sigchld 訊號處理

我們都知道wait函式是用來處理殭屍程序的,但是程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止

二、孤兒程序什麼是孤兒程序

乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。子程序死亡需要父程序來處理,那麼意味著正常的程序應該是子程序先於父程序死亡。當父程序先於子程序死亡時,子程序死亡時沒父程序處理,這個死亡的子程序就是孤兒程序。但孤兒程序與殭屍程序不同的是,由於父程序已經死亡,系統會幫助父程序**處理孤兒程序。所以孤兒程序實際上是不占用資源的,因為它終究是被系統**了。不會像殭屍程序那樣占用id,損害執行系統。

2.**實現一下

#include#include#includeint main()

else if(ret==0)

else

return 0;

}

結果如下:

重啟另乙個終端:

殭屍程序和孤兒程序

殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...

殭屍程序和孤兒程序

什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...

殭屍程序和孤兒程序

殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...