linux產生zombie的原因是什么

linux產生zombie(僵尸進程)的原因是:父進程產生子進程后,子進程先于父進程退出,但父進程沒有處理子進程發出的退出信號,因此子進程就會被稱為僵尸進程;此時使用root身份也不能kill殺死進程,可以通過殺死子進程的父進程來解決。

linux產生zombie的原因是什么

本教程操作環境:linux7.3系統、Dell G3電腦。

linux產生zombie的原因是什么

產生原因:

僵尸進程,英文名zombie process,顧名思義就是死掉的進程。那么僵尸進程究竟是什么產生的呢

僵尸進程產生的原因就是父進程產生子進程后,子進程先于父進程退出,但是父進程由于種種原因,并沒有處理子進程發送的退出信號,那么這個子進程就會成為僵尸進程。

這個是所謂的zombie(僵尸進程)是指在fork()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成為僵尸進程,無法正常結束,此時即使是root身份kill -9也不能殺死僵尸進程。補救辦法是殺死僵尸進程的父進程(僵尸進程的父進程必然存在),僵尸進程成為”孤兒進程”,過繼給1號進程init,init始終會負責清理僵尸進程。

僵尸進程是指的父進程已經退出,而該進程dead之后沒有進程接受,就成為僵尸進程.(zombie)進程

解決方法:

(1) 父進程通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起。

執行wait()或waitpid()系統調用,則子進程在終止后會立即把它在進程表中的數據返回給父進程,此時系統會立即刪除該進入點。在這種情形下就不會產生defunct進程。

(2) 如果父進程很忙,那么可以用signal函數為SIGCHLD安裝handler。在子進程結束后,父進程會收到該信號,可以在handler中調用wait回收。

(3) 如果父進程不關心重點內容子進程什么時候結束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知內核,自己對子進程的結束不感興趣,那么子進程結束后,內核會回收,并不再給父進程發送信號

(4)fork兩次,父進程fork一個子進程,然后繼續工作,子進程fork一個孫進程后退出,那么孫進程被init接管,孫進程結束后,init會回收。不過子進程的回收還要自己做。

推薦學習:Linux視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享