【问题标题】:Terminate all (grand)children when terminating a child process终止子进程时终止所有(大)子进程
【发布时间】:2011-01-21 15:34:41
【问题描述】:

我将直接进入,简短且具有描述性:

C++、Windows API

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

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

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

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

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

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

感谢您的宝贵时间。

【问题讨论】:

    标签: c++ windows parent-child


    【解决方案1】:

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

    【讨论】:

    • 谢谢迈克尔。这是非常有前途的,看起来好像完美地解决了这个问题。现在去阅读更多并试一试!感谢您分享您的知识和经验。
    • Job 对象不再像 Vista 那样运行良好。 Explorer 将从快捷方式启动的程序放入作业中,防止您对任何子进程执行相同操作。
    • 我无法在我的 Win7 机器上重现这种行为 - 我编写了一个小程序来创建一个作业并将其自身添加到其中。由资源管理器通过快捷方式启动时工作正常。
    • 再次感谢。我已经在我的环境中成功地测试了这一点。这正是我遇到的问题的可靠解决方案。 @nobugz:感谢您的警告,在盲目假设某些东西是完美的之前,最好先了解潜在的问题。我能够找到几个引用此问题的资源,并且提出的解决方案是在清单文件中包含 Vista 适当的 UAC 信息以避免此问题。见social.msdn.microsoft.com/forums/en-US/windowssecurity/thread/…谢谢你们的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2023-03-07
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多