如何在没有嵌套作业对象的情况下可靠地控制子流程生命周期?

Fre*_*abe 5 c c++ winapi

Job Objects上MSDN页面解释了:

进程只能与一个作业相关联.乔布斯不能嵌套.Windows 8 Consumer Preview和Windows Server 8 Beta中添加了嵌套作业的功能.

不幸的是,这似乎正是我所需要的.我正在处理这样的进程树:

server.exe
  |
  +--+ utility.exe
  |
  +--+ launcherA.exe
  |      |
  |      +--+ programA.exe
  |             |
  |             +--+ subProcessA.exe
  |
  +--+ launcherB.exe
         |
         +--+ programB.exe
Run Code Online (Sandbox Code Playgroud)

我尝试实现以下行为:

  1. 如果server.exe以某种方式终止(因为它崩溃,或者因为用户决定使用任务管理器终止它,或者仅仅因为它完成了执行),它会取消它下面的所有进程.我为此使用了一个工作对象.

  2. 如果由于某种原因终止launcherA.exelaunchedB.exe终止,他们会删除它们下面的所有进程.不幸的是我不能在这里使用作业对象,因为作业对象不嵌套.

事实上,我经常设法通过杀死上面树中的任意进程来创建"悬空"进程.我试图避免留下任何陈旧的过程,但到目前为止我提出的所有解决方案都依赖于监视其他进程的某种监视程序 - 但如果监视程序本身被杀死,所有希望都会丢失.

Ole*_*leg 0

我认为人们对 Windows 8 将支持的新功能Nested Jobs存在误解。

如果您使用启动进程server.exe来启动进程launcherA.exesubProcessA.exe等等,您只需要开始server.exe一项工作。以这种方式,所有其他孩子(launcherA.exesubProcessA.exe等等)将在与其父母相同的工作中自动启动。因此您可以立即监控所有进程的集合。例如,您甚至可以在每次启动新进程时收到通知,以创建详细的日志文件。我在一些应用程序上这样做了,效果非常好。

您可能收到的唯一问题是,子 exe 中的某些文件是否也“足够现代”并使用乔布斯来控制他的子进程。仅在您必须使用新的嵌套作业的情况下。

如果我理解正确你的问题,你当前的问题可以通过server.exe仅放置新工作来简单解决。