Linux環境下僵死程序的產生及其避免

2021-06-18 07:23:10 字數 798 閱讀 4269

在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝sigchld/sigcld訊號處理函式呼叫waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為僵死程序,無法正常結束,此時即使是root身份kill -9也不能殺死這類程序。補救辦法是殺死殭屍程序的父程序(僵死程序的父程序必然存在),僵死程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理僵死程序。

產生僵死程序的程式:

#include#include#include#includeint main()

else

}

程式編譯執行後,子程序退出傳送sigcld訊號給父程序,而父程序沒有處理此訊號的動作,導致子程序無法正常結束。

執行程式zombie的同時,開啟另乙個終端執行ps aux會有如下的情況:

從結果中可以看出,此子程序狀態為z+,是僵死程序

如何避免僵死程序?途徑有兩種:1.父程序忽略sigcld訊號;2.父程序捕捉sigcld訊號,在訊號處理函式中獲取子程序退出狀態。

第一種情況直接在原程式中新增signal(sigcld,sig_ign)即可;

下面討論第二種情況,加入訊號處理函式:

#include#include#include#includevoid handle_sigcld(int signo)

int main()

else

}

程式安裝訊號處理函式handle_sigcld,當子程序結束時,觸發訊號處理函式,等待子程序結束。

linux僵死程序

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

linux僵死程序

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

Linux 僵死程序

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