2012-06-16 205 views
1

有沒有辦法殺死我的應用程序的子進程,並執行它的清理(調用解構器和atexit函數),類似於exit(exit_code),但在另一個進程?殺死子進程清除

+0

可能的重複http://stackoverflow.com/questions/6501522/how-to-kill-a-child-process-by-the-parent-pr Ocess –

+0

@MareInfinitus這是unix,我需要一個Windows實現 –

回答

3

如果你在windows上,你可能通過CreateProcess啓動你的子進程,它有一個PROCESS_INFORMATION作爲最後一個參數。

CreateProcess on MSDN

Process Information on MSDN

選項1:

這個過程信息包含的句柄過程中hProcess構件啓動。

您可以存儲此句柄並使用它來殺死您的子進程。

插入 您可能想要發送WM_CLOSE和/或WM_QUIT? 爲 「乾淨」 結束進程:

這裏是做什麼KB how to cleanly kill win32 processes

**末尾插入**知識庫文章

選項2:

這裏有一個討論關於如何正確地殺死進程樹:Terminate a process tree on windows

+0

'ExitProcess'殺死了調用它的進程,我需要從父進程中殺死子進程,'TerminateProcess'不執行清理! –

+0

由於您沒有提供有關如何生成這些流程以及它們是什麼類型的流程的信息,它有點困難。發送一個WM_CLOSE可能沒關係,或者一個GenerateConsoleCtrlEvent()可以完成這個工作。 –

+0

我使用'CreateProcess'和我對這樣做的普遍方式感興趣,不同於'WM_CLOSE/WM_QUIT',它假定進程有一個窗口 –

2

這種事情沒有簡單的Win32 API。操作系統不關心你的程序的源代碼是用什麼語言編寫的,編譯後的程序看起來只是一系列的CPU指令和數據。

最簡潔的方法是在進程之間建立某種通信通道(例如通過共享內存)並簡單地請求進程終止。

您可以通過將子進程作爲調試進程啓動,然後使用調試API來改變子進程的行爲來達到同樣的效果,但這太乾擾並且不易實現。

+1

這是最簡單和最便宜的「溝通渠道」,這是一個命名事件。 – arx

+0

@arx:確實是不錯的選擇。 –

+0

@arx我不能這樣做,子進程不是由我寫的 –