殭屍程序和孤兒程序

2021-08-28 12:18:30 字數 1779 閱讀 6618

模擬殭屍程序也比較簡單,只是要求子程序退出,而父程序還在執行,並且父程序沒有讀取子程序退出狀態碼。下面我們來模擬乙個殭屍程序

在乙個終端執行上圖所示** 

接下來開啟另外乙個終端,執行下面這條指令:(執行這條指令時,速度要快一點,因為我們的**值sleep了5秒,當然你也可以設定時間長一點)

while :; do ps aux | grep myproc | grep -v grep; sleep 1;echo "########################"; done

接下來你會看到下圖所示的現象:

分析一下這張圖所代表的狀態:

上圖中前面四個紅色小框內代表子程序的狀態是s,後面三個紅色小框表示子程序已經進入了殭屍狀態,想必大家都知道子程序會進入殭屍狀態的原因吧:當子程序sleep(5)結束後,立即執行exit函式,子程序退出;而父程序一直在while(1)死迴圈,無法讀取子程序的退出狀態,導致子程序變成了殭屍程序。

殭屍程序的危害:

如果父程序不呼叫wait/waitpid,則子程序的保留資訊不會被釋放,造成核心資源的無法**,也就是會造成記憶體洩露;

同時程序號會一直被占用,系統所能使用的程序號是有限的,大量地產生殭屍程序將會導致系統不能產生新的程序。

實現孤兒程序也很簡單,只需要讓父程序退出,子程序在執行就ok了,我們可以對殭屍程序的**稍作修改就可以看到孤兒程序了

執行上圖所示**:

接下來同樣的開啟另外乙個終端,執行下面這條指令:(執行這條指令時,速度要快一點,因為我們的**值sleep了5秒,當然你也可以設定時間長一點)

while :; do ps axj | grep myproc | grep -v grep; sleep 1;echo "########################"; done

注意此時的引數是 axj 而不是 aux,因為axj才能看到父程序的id。我們可以看到下圖所示的現象:

分析:

上圖中前面四個紅色小框內代表子程序的父程序的id是3259,後面六個紅色小框表示子程序的父程序id是1,當父程序sleep(5)結束後,立即執行exit函式,父程序退出;而子程序一直在while(1)死迴圈,子程序的父程序變成1號init程序,由1號程序**。

殭屍程序和孤兒程序

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

殭屍程序和孤兒程序

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

殭屍程序和孤兒程序

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