2011-12-12 81 views
2

kill - does it kill the process right away?子進程可以在<defunct>沒有父進程死掉嗎?

我發現我的答案,我設置了一個信號處理器爲SIGCHLD並且在處理器推出wait。這樣,每當父進程kill是一個子進程時,就會調用該處理程序,並且它將調用wait收穫這個孩子。 - 動機是清除進程表條目。

即使沒有其父進程死亡,我仍然看到一些子進程會持續幾秒鐘。 - 這個怎麼可能?

我看到這個通過ps。精確地爲ps -o user,pid,ppid,command -ax併爲父進程,子進程和子系統取消激活。

回答

4

一個進程在退出(從一個信號,呼叫exit,從main返回,無論什麼時)立即失效(殭屍)。它保持殭屍直到wait由其父母。

因此,所有進程在退出時至少暫時成爲殭屍。

如果父進程在調用wait之前需要一點時間(因爲它正在做其他工作,或者只是因爲調度程序還沒有給它CPU時間),那麼你會看到殭屍了一下。如果父母從不呼叫wait,那麼當它最終退出時,init(pid 1)將採用其殭屍小孩,並在其上撥打wait

4

只有當其父進程沒有已經死亡並且尚未等待時,子進程纔會失效(成爲殭屍)。如果最初的父母死亡,那麼孩子的父母成爲進程ID 1,並且該進程的主要任務是等待其(繼承的)孩子死亡並將他們從進程列表中移除,以使他們不是殭屍。 (注意:孤兒或守護進程由PID 1自動繼承;它不會被分配給祖父母或曾祖父母級別的進程。)

在孩子死亡的時間與父母通過wait()(或waitpid()waitid()或任何其他變體)收集退出信息,它是進程列表中的殭屍,顯示爲defunct,由ps顯示。

但是,爲了回答你的問題的標題:

  • 是,進程可以去無其父死亡解散。

(如果它的父不是死了也只能去解散。)

+0

真棒。萬分感謝 :) – hari