模擬實現殭屍程序和孤兒程序

2021-08-07 04:56:10 字數 1531 閱讀 8872

殭屍程序:乙個子程序在其父程序沒有呼叫wait()或waitpid()的情況下退出。這個子程序就是殭屍程序。

程序在終止時,系統會**所有核心分配給它的記憶體、關閉它開啟的所有檔案等等,但還會保留一些極少的資訊,因為

程序終止後有些資訊對於父程序和核心還是很有用的,例如程序的id號、程序的退出狀態、程序執行的cpu時間等。父程序可以使用 wait/waitpid 等系統呼叫來獲得這些資訊,並為子程序做一些收尾工作。

但如果父程序一直不呼叫wait / waitpid的話, 那麼子程序保留的那段資訊就不會釋放,其程序號就會一直被占用,這樣子程序就會成為「佔著茅坑不拉屎」的殭屍程序,除非等到其父程序退出後該程序將被init(程序號為1)**。

其實任何乙個子程序(init除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。

這是每個子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這時用ps命令就能看到子程序的狀態是「z」。如果父程序能及時處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。  如果父程序在子程序結束之前退出,則子程序將由init接管。init將會以父程序的身份對殭屍狀態的子程序進行處理。

由於系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序,這種危害還是蠻大的。

孤兒程序:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。

每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序, 看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init來接管他,成為他的父程序。故孤兒程序的狀態收集工作由init程序負責。

首先編寫乙個殭屍程序,由於我們無法得知是子程序先退出還是父程序先退出,所以使父程序休眠30s,以保證子程序先退出。

使程式執行起來,然後開啟另外乙個終端,檢視程序狀態

可以看出此時系統中多了乙個狀態為『z+』,程序號為4117的殭屍程序,我們用kill來殺掉這個程序,卻發現4117程序仍然存在,此時我們就能明白為什麼稱之為殭屍程序了。等到30s後,父程序退出了,這個殭屍程序也就被init收屍了。

編寫乙個孤兒程序,保證父程序比子程序先退出,兩次輸出子程序的pid和ppid,觀察有何不同

可以看出子程序的ppid一開始為4265,等到父程序退出後,子程序被init程序領養,ppid變為1。

模擬實現殭屍程序和孤兒程序

首先我們來先了解一下什麼是殭屍程序和孤兒程序?當你建立了子程序後,讓父子程序幹不同的事,如果,子程序先完成事情要退出時,然後它就會等 人 來讀取它的退出狀態資訊 也就是他的父程序 這個時候,子程序就需要一直維持這這個狀態,這個狀態就是殭屍狀態 我們也稱為z狀態 也就是說,當乙個子程序退出時,他的父程...

模擬實現殭屍程序, 孤兒程序

在linux下程序有多種狀態以下就是我列舉的一些狀態 r執行狀態 running 並不意味著程序一定在執行中,它表明程序要麼在執行中要麼在執行佇列裡。s睡眠狀態 sleeping 意味著程序在等待事件的完成 這裡的睡眠有時候也會叫可中斷睡眠 interruptible sleep d磁碟休眠狀態 d...

模擬實現殭屍程序, 孤兒程序

殭屍狀態是乙個比較特殊的狀態。當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態。從上圖我們可以看出,1...