有一个建议将作业对象与 I/O 完成端口相关联并监听通知
JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO
作为等待子进程(无需访问源代码)树完成的正确方法。但在MSDN中:
请注意,除了使用 JobObjectNotificationLimitInformation信息类,消息是 仅作为通知及其交付完成 端口不保证。消息未能到达 完成端口并不一定意味着该事件没有发生 发生。
那么Windows中没有真正可靠的方法来等待进程树完成,不是吗?
我尝试了一下现有的其他选项,除了 WaitForObject、WaitForObjectEx 和多个对象的挂件之外,使用 I/O 完成端口是唯一可用的方法。
更有趣的是,至少在 Windows 10 上,除非调用上述方法,否则不会应用 TerminateJobObject。
就此而言,带有 JOBOBJECT_BASIC_ACCOUNTING_INFORMATION 的 QueryInformationJobObject 将显示作业对象中的进程未终止。
所以要可靠,你必须