2013-08-25 71 views
3

殺死父級的所有進程但不是父級的最佳方法是什麼?比方說,我有一個未定數的子進程,我已經分叉並且在給定的報警中,在我的信號處理程序中,我想要殺死所有子進程,但由於各種原因保持自己運行。截至目前,我正在使用kill(-1 * parentPid,SIGKILL),但這會殺死我的父母及其子女。殺死父級的所有子進程但離開父級活動

+0

你可以簡單地跟蹤孩子的PIDs在一個簡單的數組,當你叉他們? – user4815162342

+0

我試過,但由於被分叉進程的量是不知道,我必須保持多少已經取得了櫃檯,以便正確地對其進行索引和計數器變量的狀態不是很好在多個流程定義。 ..當然,我的執行可能很差。 –

+0

所以你可以發送一個信號給父母和孩子,對嗎? –

回答

3

完成此操作的一種方法是發送一些可以捕獲的信號(而不是SIGKILL)。然後,安裝一個信號處理程序,檢測當前進程是否爲父進程,如果不是父進程,則調用_exit()

您可以使用SIGUSR1SIGUSR2或者SIGQUIT

我已經說明了這種技術here

可選(根據Lidong的建議),在發出kill()命令之前,父進程可以在信號上使用SIG_IGN

signal(SIGQUIT, SIG_IGN); 
kill(-parent_pid, SIGQUIT); 
0

Jxh的回答很好。無論如何,也許你可以給fork之後的每個子進程給一個signal hander,並讓它調用exit函數。你給父母signal hander,並讓它ignore的信號(如SIGUSR1)。這可能會添加代碼行,但您不需要檢測信號處理函數中的父進程或子進程。

+3

嗨李東,一個小例子會走很久方式來說明應該做什麼=) – puk

相關問題