linux僵死程序

2021-06-19 05:56:16 字數 1902 閱讀 7895

乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀, 而是留下乙個稱為僵死程序(zombie)的資料結構(系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個僵死程序,並不能將其完全銷毀)。

一、僵死程序的產生

在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等,但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the

termination status of the process,執行時間the amount of cpu time taken by the process等), 直到父程序通過wait/waitpid來取時才釋放。此時該程序處於僵死狀態,該程序成為僵死程序(zombie process)。 這保證了父程序可以獲取到子程序結束時的狀態資訊。

在linux程序的狀態中,僵死程序是非常特殊的一種,它已經放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等資訊供其他程序收集,除此之外,僵死程序不再占有任何記憶體空間。它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持僵死狀態,如果這時父程序結束了,僵死的子程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理僵死程序,它產生的所有僵死程序也跟著消失(每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序, 看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init來接管他,成為他的父程序)。但是如果如果父程序是乙個迴圈,不會結束,那麼子程序就會一直保持僵死狀態,這就是為什麼系統中有時會有很多的僵死程序。怎麼檢視僵死程序,利用命令ps,可以看到有標記為z的程序就是僵死程序。

二、僵死程序的危害

如果父程序不呼叫wait/waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號會一定被占用,但是系統所能使用的程序號是有限的,如果產生了大量的僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序。 

三、僵死程序的避免

1、父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起

2、如果父程序很忙,那麼可以用signal函式為sigchld安裝訊號處理函式。子程序結束後,父程序會收到該訊號,可以在訊號處理函式中呼叫wait** 。

3、如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld, sig_ign)通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序

傳送訊號。

或用sigaction函式為sigchld設定sa_nocldwait,這樣子程序結束後,就不會進入僵死狀態

struct sigaction sa;

sa.sa_handler = sig_ign;

sa.sa_flags = sa_nocldwait;

sigemptyset(&sa.sa_mask);

sigaction(sigchld, &sa, null);

4、fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork乙個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的**還要父程序來做。

int nstatus;

pid_t pid;

pid = vfork();

//生成子程序

if(pid > 0)

//父程序

else

if(0 =

= pid)

//子程序

else

if(0 =

= pid)

//孫程序

}else

}else

}

linux僵死程序

乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為僵死程序 zombie 的資料結構 系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個僵死程序,並不能將其完全銷毀 一 僵死程序的產生 在每個程序退出的時候,核心釋放該程序所有的資源,...

Linux 僵死程序

僵死程序的產生 1.當父程序未結束,子程序結束,並且父程序未獲取子程序的退出狀態。子程序被稱為僵死程序。2.程序執行結束,程序主體 執行 資料 資源 都釋放,而其pcb 並未釋放。3.孤兒程序 父程序死後僵死程序成為 孤兒程序 由init接管 include include include incl...

Linux中僵死程序

僵死程序 殭屍程序 一 僵死程序產生的原因 用fork建立程序,子程序終止時,它與父程序之間還會保持聯絡,知道父程序也正常終止或者父程序呼叫 wait 才結束,所以程序表中子程序的表項不會立即釋放,因為它的退出碼還需要儲存起來,以備父程序 wait 呼叫的時候使用。子程序先於父程序結束,父程序沒有獲...