解析殭屍程序和孤兒程序

2021-07-31 08:36:27 字數 1282 閱讀 1076

大家都知道linux中的程序分為多種狀態,例如:

「r (running)」執行狀態、

「s (sleeping)」睡眠狀態(淺度睡眠)、

「d (disk sleep)」磁碟睡眠狀態、

「t (stopped)」停止程序、

「x (dead)」死亡狀態、

「z (zombie)」僵死狀態等等。

僵死狀態是乙個比較特殊的狀態:當程序退出並且父程序(使用wait()系統呼叫)沒有讀取到子程序退出的返回**時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直等待父程序讀取退出狀態**。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法**,等到其父程序退出後該程序將被init**

現在我們來用**模擬一下殭屍程序:

再來看一下執行結果:

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

來看一下孤兒程序的實現:

執行結果:

殭屍程序危害場景:

例如有個程序,它定期的產生乙個子程序,這個子程序需要做的事情很少,做完它該做的事情之後就退出了,因此這個子程序的生命週期很短,但是,父程序只管生成新的子程序,至於子程序 退出之後的事情,則一概不聞不問,這樣系統執行上一段時間之後,系統中就會存在很多的僵死程序。

倘若用ps命令檢視的話,就會看到很多狀態為z的程序。 嚴格地來說,僵死程序並不是問題的根源,罪魁禍首是產生出大量僵死程序的那個父程序。

那我們該如何消滅系統中大量的僵死程序呢?答案就是把產生大量僵死程序的那個元**掉(也就是通過kill傳送sigterm或者sigkill訊號啦)。殺掉元凶程序之後,它產生的僵死程序就變成了孤兒程序,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們占用的系統程序表中的資源,這樣,這些已經僵死的孤兒程序 就能瞑目而去了。

殭屍程序與孤兒程序解析

我們都知道linux中的程序可以分有多種狀態 r runing 執行狀態 s sleeping 淺度睡眠狀態 d disk sleep 磁碟睡眠狀態 t stopped 停止程序 x dead 死亡狀態 z zombie 殭屍狀態 殭屍狀態 1 殭屍狀態是乙個比較特殊的狀態,當程序退出父程序 使用w...

殭屍程序和孤兒程序

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

殭屍程序和孤兒程序

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