程序學習 4 殭屍程序

2021-08-09 09:17:18 字數 1427 閱讀 6935

一、殭屍程序:當前程序執行結束,但其資源沒有被**;

二、驗證方法:

1.用fork函式建立兩個程序,讓子程序退出,父程序不呼叫wait/waitpid為子程序**資源;(**如下)

#include 

#include

#include

int main(int argc, const

char *argv)

else

if(pid == 0)

else

if(pid > 0)

return

0;}

2.編譯-執行,如下圖;

3.新建另乙個終端(shift+ctrl+n),然後輸入檢視程序命令 ps -ajx, 現象如下圖(z+:前台執行的殭屍程序);

三、殭屍程序的危害

由於子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序 到底什麼時候結束. 那麼會不會因為父程序太忙來不及wait子程序,或者說不知道 子程序什麼時候結束,而丟失子程序結束時的狀態資訊呢?

不會。因為unⅸ提供了一種機制可以保證只要父程序想知道子程序結束時的狀態資訊, 就可以得到。這種機制就是: 在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果程序不呼叫wait / waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。

四、避免方法(具體方法見下一部落格)

1.讓父程序先於子程序退出,即讓子程序成為孤兒程序,此時,子程序會被1號程序(init程序)所收養,當子程序結束時,1號程序會為子程序**系統資源(apue中講了呼叫兩次fork,形成乙個孫子程序,讓孫子程序變成孤兒程序來避免殭屍程序);

2.父程序呼叫wait函式及waitpid函式,以阻塞或非阻塞輪訓的方式來等待子程序的退出,並為子程序**系統資源;

Defunct程序 殭屍程序

下面談談 defunct 程序,中文翻譯叫殭屍程序。下文整理於網路以及apue一書。一 什麼是殭屍程序 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序。當用ps命令觀察程序的執行狀態時,看到這些程序的狀態列為defunct。殭屍...

Defunct 程序 殭屍程序

下面談談 defunct 程序,中文翻譯叫殭屍程序。下文整理於網路以及apue一書。一 什麼是殭屍程序 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序。當用ps命令觀察程序的執行狀態時,看到這些程序的狀態列為defunct。殭屍...

Defunct程序 殭屍程序

下面談談 defunct 程序,中文翻譯叫殭屍程序。下文整理於網路以及apue一書。一 什麼是殭屍程序 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序。當用ps命令觀察程序的執行狀態時,看到這些程序的狀態列為defunct。殭屍...