當前位置:編程學習大全網 - 編程軟體 - Linux 編程關於僵屍進程的疑惑~

Linux 編程關於僵屍進程的疑惑~

當然會成為僵屍進程,妳的C、D子進程比父進程先結束,

在fork ()/execve()過程中,假設子進程結束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成為僵屍進程,無法正常結束,此時即使是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會回收。不過子進程的回收 還要自己做。

  • 上一篇:目前UI設計的就業前景怎麽樣
  • 下一篇:無錫linux編程
  • copyright 2024編程學習大全網