Linux 僵死程序的簡單介紹

2021-10-05 15:48:20 字數 1519 閱讀 4247

一、僵死程序的定義

乙個程序執行結束也就是**部分執行結束,但是程序的pcb沒有被系統釋放。

程序結束後,在pcb中還要儲存程序退出碼,以備其父程序獲取其退出碼。而僵死程序恰恰就是父程序沒有獲取退出碼。也就是父程序未結束,子程序結束,並且父程序沒有獲取子程序的退出碼,這樣就形成了僵死程序。

二、在系統上體現僵死程序

我們在系統上建立這樣乙個檔案,裡面寫這樣的**

#include

#include

#include

#include

intmain()

else

exit(0);}

從上面的**我們看到父程序比子程序多執行10秒鐘,在這個10秒的時間差內。父程序就是乙個僵死程序。我們在系統上進行執行後的結果是:

執行之後我們可以看到第一次檢視是當父子程序還在執行的時候,系統上是存在父程序和子程序的。在等待10秒之後,子程序執行結束後。再去檢視時,這個時候我們發現系統上就出現了僵死程序。如上圖中的紅色部分,這個符號是僵死程序的標識。

三、如何處理僵死程序的產生

僵死程序的危害是比較大的。像我們剛寫的**,它的大小可能才1k到2k之間,但是乙個僵死程序的大小就是1.7k。**是在磁碟上的,但是僵死程序是在記憶體上的。如果大量的僵死程序堆積在記憶體上,系統記憶體將會很快的被耗盡,所以我們要避免僵死程序的產生,並且在它出現後能很快得處理僵死程序。

那麼如何處理僵死程序呢?

很簡單,我們只需要讓父程序獲取子程序的退出狀態

方法如下:

pid_t wait(int *result);

這個函式返回處理的程序的pid。

result:獲取程序的退出碼

就如剛才的**,我們如何處理剛才產生的僵死程序呢?我們只需要在**上加上這樣兩句**:

pid_t id=wait(null);

printf(「id = %d\n」,id);

**如下:

int

main()

else

exit(0);}

再在系統上執行的時候我們就會發現等child over以後,系統中就只剩乙個程序。呼叫wait後會有兩個問題的存在

第乙個是呼叫wait後,wait本身會阻塞,直到任意乙個子程序退出,然後獲取子程序的退出狀態。

第二個假如有三個子程序,那麼在使用wait時會調三次wait,而且三個程序的結束時間不一樣,父程序就會去等待子程序的結束

linux僵死程序

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

linux僵死程序

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

Linux 僵死程序

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