殭屍進程的避免

父進程未結束,子進程先結束,會產生殭屍進程。
       子進程在調用exit命令結束自己的生命的時候,其實它並沒有真正的被銷燬,而是留下一個稱爲殭屍進程(Zombie)的數據結構(系統調用 exit,它的作用是使進程退出,但也僅僅限於將一個正常的進程變成一個殭屍進程,並不能將其完全銷燬)。
       即使是root身份kill -9也不能殺死殭屍進程。補救辦法是殺死殭屍進程的父進程(殭屍進程的父進程必然存在),殭屍進程成爲"孤兒進程",過繼給1號進程init,init始終會負責清理殭屍進程。

 殭屍進程的避免:
(1) 父進程通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起。
(2) 如果父進程很忙,那麼可以用signal函數爲SIGCHLD安裝handler,因爲子進程結束後, 父
      進程會收到該信號,可以在handler中調用wait回收。
(3) 如果父進程不關心子進程什麼時候結束,那麼可以用signal(SIGCHLD, SIG_IGN) 通知內
      核,自己對子進程的結束不感興趣,那麼子進程結束後,內核會回收, 並不再給父進程發送
      信號。
(4) 還有一些技巧,就是fork兩次,父進程fork一個子進程,然後繼續工作,子進程fork一 個孫進
     程後退出,那麼孫進程被init接管,孫進程結束後, init會回收。不過子進程的回收 還要自己
     做。 
         
建議使用第三種方法,父進程直接忽略子進程的結束,留給內核作回收處理。這樣就不
    會產生殭屍進程。 
發佈了34 篇原創文章 · 獲贊 12 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章