2010-02-26 158 views
4

我會就在跳,是簡要的描述時,終止所有(盛大)兒童:終止子進程

C++中,Windows API

我創建使用CreateProcess運行外部子進程(命令在線)應用程序。我已經建立了超時,如果子進程在那時還沒有返回正常執行,我希望強制終止該子進程。

理想情況下,我想爲子進程充當一樣的,如果它被稱爲ExitProcess,或者如果Ctrl+C被送到其控制檯(從默認的控制檯控制處理程序調用ExitProcess)。

我的解決方案到目前爲止一直使用TerminateProcess來強制殺死孩子。這確實會迫使孩子立即終止,但不幸的是,如果該孩子產生了自己的孩子,他們將一直跑到他們的「自然」完成。

有沒有辦法告訴子進程調用ExitProcess,或強制所有孩子的孩子也在終止時調用TerminateProcess

這些外部應用程序是我無法控制的,因此我無法修改它們以提供自定義的解決方法。

假設沒有關於grand-child進程(名稱/ pids/etc)的知識,這將允許我個別地在grand-child進程上手動調用TerminateProcess。雖然這可以通過手動枚舉所有進程,映射進程關係以及跟蹤所有進程來完成,但我認爲這不是一個有效的解決方案,除非是絕對的最後手段。

謝謝你的時間。

回答

5

您可以使用Job objects作爲一個單元終止所有進程。您可以通過CreateJobObject API創建作業對象,並使用AssignProcessToJobObject爲其分配進程。作業對象中的進程創建的新進程默認屬於同一個作業對象。調用TerminateJobObject將終止作業對象中的所有關聯進程。

+0

謝謝Michael。這非常有希望,看起來好像完全解決了這個問題。現在去閱讀更多,並給它一個鏡頭!感謝您分享您的知識和經驗。 – KevenK 2010-02-26 21:58:14

+0

作業對象不再適用於Vista。資源管理器將從快捷方式開始的程序放入作業中,阻止您對任何子進程執行相同的操作。 – 2010-02-26 22:25:58

+0

我無法在我的Win7盒子上重現這種行爲 - 我寫了一個小程序來創建一個作業並將其添加到它。通過快捷方式由資源管理器啓動時工作正常。 – Michael 2010-02-27 00:37:57