2012-05-07 80 views
2

我有一個由pid指定的子進程。這個過程可能是:殺害和收割過程

  1. 運行
  2. 已關閉/殭屍(unreaped)
  3. 已經收穫了(因此不再存在)

我想殺死這個進程,並確保沒有殭屍遺蹟。目前我的代碼是

kill(pid, SIGKILL); 
int temp; 
waitpid(pid, &temp, 0); 

這工作?

編輯:由pid指定的過程是我的程序的孩子。

+1

您應該考慮一下'pid'已被重用於其他進程的可能性。 – NPE

+0

這是一個很好的觀點。首先檢查這個過程是否是我的程序的一個孩子可能是一個好主意? – Sticky

+0

@Sticky:不需要檢查,因爲如果該pid不是孩子,waitpid()會失敗並將errno設置爲ECHILD。 – janneb

回答

2

這看起來很好,但我想知道爲什麼你會讓情況3發生。您應該執行一些簿記,您的哪些子流程已終止並正在等待收割。 一種方法是爲SIGCHLD安裝一個處理程序,設置waitpid的順序標誌。這樣你保證所有的pid實際上都是你的子進程的那些pid。

2

應該可以正常工作,但一定要檢查waitpid的返回值。 由於信號,該呼叫可能已經返回。