2011-07-26 31 views
1

場景:我們有一個linux守護進程,稱之爲Alpha。阿爾法叉子/執行者一個孩子過程,布拉沃。然後布拉沃產生幾個孩子的過程,稱他們爲查理和三角洲。Linux - 找到一個垂死的進程的所有孩子(我自己的孫子)

 
Alpha 
    | 
    \-Bravo 
    | 
     \-Charlie 
    | 
     \-Delta 

布拉沃死亡。 Alpha安裝了一個sig子處理程序,它會觸發。

我如何從阿爾法找到所有布拉沃(查理和三角洲)的孩子,以便我可以殺死他們?

我觀察到的是,一旦布拉沃死亡,查理和德爾塔就成爲init的孩子(pid = 1)。我需要能夠1)在Bravo的孩子被重新分配之前檢查過程樹,或者2)確保Bravo的孩子被阿爾法遺傳。如果是這樣的話,我可以理清我的(阿爾法)自己的孩子中誰是誰。

回答

1

您可以爲此使用進程組。當Bravo啓動時,請在execve()之前讓它成爲使用setpgid(0, 0);的過程組組長。其子代將繼承此進程組(其PGID等於Bravo的PID,因此已知爲Alpha)。

Bravo退出時,其子將繼承init,但其PGID不會更改。 Alpha然後可以使用kill()一次性發信號給它們,提供PGID的負數作爲第一個參數。例如。在Alpha你可能會這樣做:

exited_child = wait(&status); 
if (exited_child > 0) 
    kill(-exited_child, SIGTERM); 
+0

太棒了。我已經測試了你的建議。這正是我需要的。 –

相關問題