可靠等待进程树完成

问题描述 投票:0回答:1

有一个建议将作业对象与 I/O 完成端口相关联并监听通知

JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO
作为等待子进程(无需访问源代码)树完成的正确方法。但在MSDN中:

请注意,除了使用 JobObjectNotificationLimitInformation信息类,消息是 仅作为通知及其交付完成 端口不保证。消息未能到达 完成端口并不一定意味着该事件没有发生 发生。

那么Windows中没有真正可靠的方法来等待进程树完成,不是吗?

windows winapi process wait child-process
1个回答
0
投票

我尝试了一下现有的其他选项,除了 WaitForObject、WaitForObjectEx 和多个对象的挂件之外,使用 I/O 完成端口是唯一可用的方法。

更有趣的是,至少在 Windows 10 上,除非调用上述方法,否则不会应用 TerminateJobObject。

就此而言,带有 JOBOBJECT_BASIC_ACCOUNTING_INFORMATION 的 QueryInformationJobObject 将显示作业对象中的进程未终止。

所以要可靠,你必须

  • 在循环中使用具有上限时间限制的 GetQueuedCompletionStatus 来实现“预期时间行为”
  • 出现“意外时间行为/发生过多资源使用”等情况时,将 TerminateJobObject 与另一次调用 WaitForObject、WaitForObjectEx / 多对象挂件或 GetQueuedCompletionStatus 一起使用,以确保执行挂起的作业对象任务
  • 未经测试,但强烈建议:确保至少等待/获取进程的所有直接祖先的状态,以便执行所有依赖项任务
  • 未经测试,但不确定:对其他待处理的作业对象任务进行测试,并检查作业对象任务是否可以执行(没有任何阻碍)
  • 为了额外确保在此期间不会丢失任何内容,请随后在循环中使用 QueryInformationJobObject JOBOBJECT_BASIC_ACCOUNTING_INFORMATION 和字段 ActiveProcesses。
© www.soinside.com 2019 - 2024. All rights reserved.