Linux中產生zombie的原因詳解及解決方法!

老男孩IT教育機構發表於2023-02-20

  zombie英文全稱是zombie process,中文名為殭屍程式,也就是死掉的程式,那麼Linux中產生zombie的原因是什麼?具體內容請看下文。

  殭屍程式,英文名zombie process,顧名思義就是死掉的程式。

  殭屍程式產生的原因就是父程式產生子程式後,子程式先於父程式退出,但是父程式由於種種原因,並沒有處理子程式傳送的退出訊號,那麼這個子程式就會成為殭屍程式。

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

  殭屍程式是指的父程式已經退出,而該程式dead之後沒有程式接受,就成為殭屍程式

  解決方法:

  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會回收。不過子程式的回收還要自己做。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2936006/,如需轉載,請註明出處,否則將追究法律責任。

相關文章