2012-01-06 78 views
17

Linux中的kill函數是否同步?說,我編程地調用kill函數來終止一個進程,它只會在目標進程終止時返回,或者它只是發送信號並返回。如果是這樣的話,我怎麼才能讓它等待預定的進程被殺呢?殺死函數是否同步?

+2

有意思的是,我可以說不,因爲我已經在流程中使用了'kill',讓它返回並讓流程仍然存在。然後不得不做一個'殺死-9'。 – 2012-01-06 18:01:45

+1

注意:並非所有發送給進程的信號都會終止它 - 即使是'kill 1234'(使用SIGTERM)也會被截獲並被繞過。無條件殺死的唯一方法是使用'kill -9',這相當殘酷(沒有清理的機會)。 – Piskvor 2012-01-06 18:05:16

+1

即使'kill -9'也會立即殺死它,因爲有些狀態(特別是狀態「D」)不會死亡,直到內核線程完成。 – 2012-01-06 18:06:33

回答

18

不,因爲它不會殺死任何東西,它只會向進程發送一個信號。

默認情況下,該信號甚至可以被阻止或忽略。

這代表發送SIGKILL

等待過程中死亡你不能阻止kill -9

while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done 
+0

+1顯示一個簡單的等待直到pid消失的方法。 – 2012-01-06 19:00:03

+0

SIGKILL不能被進程阻止或忽略。但你說得對,這個過程不會立即終止。如果一個進程正在進行系統調用,它只會在系統調用返回時結束。所以如果它做了一些真正的重大處理,可能需要時間。 – ugoren 2012-01-06 20:38:24

+1

如果它處於'UNINTERRUPTIBLE'狀態,它也會拒絕死亡 – 2012-05-02 18:53:47

3

壓井系統調用不會等待其他進程做任何事情。信號被髮送到目標進程並且系統調用返回。目標進程在計劃運行時注意到信號。

4

kill不能同步,因爲它只發送一個信號。目標進程可能會忽略輸入信號(參見SIG_IGN),因此無法保證kill的效果。

實驗驗證這個假設不應該很難。啓動進程A並使其在死亡之前以10秒睡眠處理SIGTERM。然後啓動過程B,它將一個SIGTERM傳遞給A並立即退出。

3
  1. man 2 kill
  2. man wait

又見man 7 signal有關UNIX信號的更多細節。