殭屍進程

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

  殭屍進程是指的父進程已經退出,而該進程dead之後沒有進程接受,就成爲殭屍進程.(zombie)進程
  怎樣產生殭屍進程的:
  一個進程在調用exit命令結束自己的生命的時候,其實它並沒有真正的被銷燬,而是留下一個稱 爲殭屍進程(Zombie)的數據結構(系統調用exit,它的作用是使進程退出,但也僅僅限於將一個正常的進程變成一個殭屍進程,並不能將其完全銷 毀)。在Linux進程的狀態中,殭屍進程
  是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退
  出狀態等信息供其他進程收集,除此之外,殭屍進程不再佔有任何內存空間。它需要它的父進程來爲它收屍,如果他的父進程沒安裝SIGCHLD信
  號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那麼它就一直保持殭屍狀態,如果這時父進程結束了,那麼init進程自動
  會接手這個子進程,爲它收屍,它還是能被清除的。但是如果如果父進程是一個循環,不會結束,那麼子進程就會一直保持殭屍狀態,這就是爲什麼系統中有時會有很多的殭屍進程。
  怎麼查看殭屍進程:
  利用命令ps,可以看到有標記爲Z的進程就是殭屍進程。
  怎樣來清除殭屍進程:
  1.改寫父進程,在子進程死後要爲它收屍。具體做法是接管SIGCHLD信號。子進程死後,會 發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數爲子進程收屍。這是基於這樣的原理:就算父進程沒有調用wait,內核 也會向它發送SIGCHLD消息,儘管對的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。
  2.把父進程殺掉。父進程死後,殭屍進程成爲"孤兒進程",過繼給1號進程init,init始終會負責清理殭屍進程.它產生的所有殭屍進程也跟着消失

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章