【问题标题】:Closing sub-processes spawned by CreateProcess关闭 CreateProcess 产生的子进程
【发布时间】:2013-02-04 01:40:58
【问题描述】:

我正在使用 CreateProcess 来运行我的进程/应用程序。 目的是运行它,做一些事情,等待一些指示,然后关闭它(使用 TerminateProcess)。

我注意到这个应用程序/进程创建了子进程。 此外,在终止创建的进程时,子进程不会终止,仍然会保留一段时间。

我想问是否有一个选项可以用主进程以某种方式杀死所有子进程。 它会导致问题,因为当我再次执行 CreateProcess 时,之前的进程会有剩余,我认为它们会导致一些问题。

非常感谢您的帮助!

【问题讨论】:

    标签: windows winapi process subprocess createprocess


    【解决方案1】:

    使用 Windows Job Objects。作业就像流程组;一旦作业领导者(您的初始进程)终止,操作系统将负责终止作业中的所有进程。即使进程负责人崩溃,这也有效。

    【讨论】:

    • 我在几篇文章中读到过这个,问题是我无法访问这些进程,也无法向它们注入代码。因此,我无法真正将创建的子流程添加到 Job 对象中,并将其作为一个整体关闭:(
    • @fashasha:我链接的 MSDN 页面说明:After a process is associated with a job, by default any child processes it creates using CreateProcess are also associated with the job. [..] This default behavior can be changed by setting the extended limit JOB_OBJECT_LIMIT_BREAKAWAY_OK or JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK for the job.。这意味着除非您作为作业创建者明确允许,否则子进程将自动成为作业的一部分。
    【解决方案2】:

    当您使用 CreateProcess 创建流程时,您将获得一个 LPPROCESS_INFORMATION 指针。 它包含进程句柄。您需要手动关闭进程,因为没有像 Linux/Unix 中那样的进程层次结构。

    请参阅 here 了解 CreateProcess 和 here 了解 PROCESS_INFORMATION-结构。

    【讨论】:

    • PROCESS_INFORMATION 不会告诉您有关子流程的信息。您必须枚举正在运行的进程,以寻找以PROCESS_INFORMATION.dwProcessID 作为其所有者 PID 的进程,甚至可能递归地进行处理,以便您可以处理多层子进程。
    • Remy,我如何运行所有流程并寻找匹配的流程?另外,您认为这是一个耗时的操作吗?如果是这样,我将不得不跳过它。现在,我知道进程的名称(它们不太可能改变)并使用taskill 强制它们死亡。这是一个非常粗略的解决方案,但它现在有效。我想少一些 hacky...
    • @RemyLebeau Windows 没有类似进程树的任何东西(非类 Unix 操作系统),在这种情况下,您无法清楚地确定哪个进程产生了哪些进程。
    • @bash.d:这完全是错误的,您可以轻松地在 Windows 中构建进程树,因为您可以从使用 CreateToolhelp32Snapshot 创建的快照中获取任何给定进程 ID 的父进程 ID。跨度>
    • @FrerichRaabe 可能您可以创建自己的进程树,但 Windows 本身不包含进程树!
    猜你喜欢
    • 2012-01-09
    • 2012-02-16
    • 2016-05-28
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多