我会直接进入,简短而具有描述性:
C ++,Windows API
我正在使用CreateProcess
创建子进程来运行外部(命令行)应用程序。我已经内置了超时,如果子进程到那时还没有返回正常执行,我希望强制终止该子进程。
理想情况下,我希望该子进程的行为与调用ExitProcess
时的行为相同,或者好像将Ctrl+C
发送到其控制台(从ExitProcess
调用TerminateProcess
默认的控制台控制处理程序)。
到目前为止,我的解决方案是使用ExitProcess
强行杀死孩子。这确实迫使孩子立即终止,但不幸的是,如果那个孩子产生了自己的孩子,他们就会一直运行直到他们“自然”完成。
有没有办法告诉子进程调用TerminateProcess
,或强制所有孩子的孩子在调用TerminateProcess
时终止?
这些外部应用程序是我无法控制的,因此我无法对其进行修改以提供自定义解决方案。
假设不了解允许我单独手动调用{{1}}子孙进程的孙子进程(名称/ pids / etc)。虽然这可以通过手动枚举所有进程,映射进程关系和跟踪所有进程来完成,但我不认为这是一个有效的解决方案,除非作为绝对的最后手段。
感谢您的时间。
答案 0 :(得分:5)
您可以使用Job objects将所有进程作为一个单元终止。您可以通过CreateJobObject API创建一个作业对象,并使用AssignProcessToJobObject为其分配流程。默认情况下,作业对象中的进程创建的新进程属于同一作业对象。调用TerminateJobObject将终止作业对象中的所有关联进程。