终止子进程时终止所有(大)子进程

时间:2010-02-26 21:43:28

标签: c++ windows parent-child

我会直接进入,简短而具有描述性:

C ++,Windows API

我正在使用CreateProcess创建子进程来运行外部(命令行)应用程序。我已经内置了超时,如果子进程到那时还没有返回正常执行,我希望强制终止该子进程。

理想情况下,我希望该子进程的行为与调用ExitProcess时的行为相同,或者好像将Ctrl+C发送到其控制台(从ExitProcess调用TerminateProcess默认的控制台控制处理程序)。

到目前为止,我的解决方案是使用ExitProcess强行杀死孩子。这确实迫使孩子立即终止,但不幸的是,如果那个孩子产生了自己的孩子,他们就会一直运行直到他们“自然”完成。

有没有办法告诉子进程调用TerminateProcess,或强制所有孩子的孩子在调用TerminateProcess时终止?

这些外部应用程序是我无法控制的,因此我无法对其进行修改以提供自定义解决方案。

假设不了解允许我单独手动调用{{1}}子孙进程的孙子进程(名称/ pids / etc)。虽然这可以通过手动枚举所有进程,映射进程关系和跟踪所有进程来完成,但我不认为这是一个有效的解决方案,除非作为绝对的最后手段。

感谢您的时间。

1 个答案:

答案 0 :(得分:5)

您可以使用Job objects将所有进程作为一个单元终止。您可以通过CreateJobObject API创建一个作业对象,并使用AssignProcessToJobObject为其分配流程。默认情况下,作业对象中的进程创建的新进程属于同一作业对象。调用TerminateJobObject将终止作业对象中的所有关联进程。