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

时间:2012-04-25 13:36:17

标签: c++ c winapi

MSDN page on Job Objects解释说:

  

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

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

server.exe
  |
  +--+ utility.exe
  |
  +--+ launcherA.exe
  |      |
  |      +--+ programA.exe
  |             |
  |             +--+ subProcessA.exe
  |
  +--+ launcherB.exe
         |
         +--+ programB.exe

我尝试实现以下行为:

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为误解了Windows 8中支持的新功能Nested Jobs

如果您使用启动流程server.exe来启动流程launcherA.exe并启动流程subProcessA.exe等等,则只需在作业中启动server.exe即可。所有其他孩子(launcherA.exesubProcessA.exe等)将在与父母同一工作内自动启动。因此,您可以一次监控所有流程集合。例如,您甚至可以在每次启动新进程时收到通知,以创建详细的日志文件。我在一些应用程序上做了这个,它工作得非常好。

唯一可以接受的问题是,如果来自子exe的一些内容也“足够现代”,并使用Jobs来控制他的孩子。只有在你必须使用新的嵌套作业的情况下。

如果我理解了您的问题,那么只需将server.exe放在新工作中即可解决当前问题。

相关问题