终止子进程

终止子进程

问题描述:

我会就在跳,是简要的描述时,终止所有(盛大)儿童:终止子进程

C++中,Windows API

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

理想情况下,我想为子进程充当一样的,如果它被称为ExitProcess,或者如果Ctrl+C被送到其控制台(从默认的控制台控制处理程序调用ExitProcess)。

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

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

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

假设没有关于grand-child进程(名称/ pids/etc)的知识,这将允许我个别地在grand-child进程上手动调用TerminateProcess。虽然这可以通过手动枚举所有进程,映射进程关系以及跟踪所有进程来完成,但我认为这不是一个有效的解决方案,除非是绝对的最后手段。

谢谢你的时间。

您可以使用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