僵死程序(殭屍程序
)一、
僵死程序產生的原因
用fork建立程序,子程序終止時,它與父程序之間還會保持聯絡,知道父程序也正常終止或者父程序呼叫
wait
才結束,所以程序表中子程序的表項不會立即釋放,因為它的退出碼還需要儲存起來,以備父程序
wait
呼叫的時候使用。
子程序先於父程序結束,父程序沒有獲取子程序的退出碼。
實驗:
實驗解析:
如果用 ./main &命令執行上面的程式,然後在子程序結束後父程序結束前使用ps命令,就會看到僵死程序產生: main .
如果此時父程序異常終止,子程序將自動把pid為1的程序(init)作為自己的父程序,子程序就不是乙個僵死程序了。
二、如何解決僵死程序
1、程式中顯示的呼叫signal(sigchld, sig_ign)來忽略sigchld訊號,這樣子程序結束後,由核心來wait和釋放資源。
2、對子程序的退出捕獲它們的退出訊號sigchld。這樣就可以釋放它們的資源。父程序一般沒工夫在那裡守著,等著子程序的退出,所以,一般使用訊號的方式來處理,在收到sigchld訊號的時候,在訊號處理函式中呼叫(wait)waitpid() 操作來釋放他們的資源。
**示例:
void sig_chld(int signo)
return;
}
然後在main()中,在fork語句的前面的某個地方設定子程序退出的訊號處理函式,如下所示:
if(signal(sigchld, sig_chld) == sig_err)
linux僵死程序
乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為僵死程序 zombie 的資料結構 系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個僵死程序,並不能將其完全銷毀 一 僵死程序的產生 在每個程序退出的時候,核心釋放該程序所有的資源,...
linux僵死程序
乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為僵死程序 zombie 的資料結構 系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個僵死程序,並不能將其完全銷毀 一 僵死程序的產生 在每個程序退出的時候,核心釋放該程序所有的資源,...
Linux 僵死程序
僵死程序的產生 1.當父程序未結束,子程序結束,並且父程序未獲取子程序的退出狀態。子程序被稱為僵死程序。2.程序執行結束,程序主體 執行 資料 資源 都釋放,而其pcb 並未釋放。3.孤兒程序 父程序死後僵死程序成為 孤兒程序 由init接管 include include include incl...