MSDN page on Job Objects 解释说:
不幸的是,这似乎正是我所需要的。我正在处理这样的流程树:
server.exe
|
+--+ utility.exe
|
+--+ launcherA.exe
| |
| +--+ programA.exe
| |
| +--+ subProcessA.exe
|
+--+ launcherB.exe
|
+--+ programB.exe
我尝试实现以下行为:
server.exe
以某种方式终止(因为它崩溃了,或者因为用户决定使用任务管理器终止它,或者仅仅因为它完成执行),它会关闭它下面的所有进程。我为此使用了一个作业对象。 launcherA.exe
或 launchedB.exe
由于某种原因终止,它们会删除其下的所有进程。不幸的是,我不能在这里使用作业对象,因为作业对象不嵌套。 事实上,我经常通过杀死上述树中的任意进程来创建“悬空”进程。我尽量避免留下任何陈旧的进程,但到目前为止我提出的所有解决方案都依赖于某种监视其他进程的看门狗进程 - 但如果看门狗本身被杀死,则所有希望都将破灭。
最佳答案
我认为有人误解了 Windows 8 将支持的新功能 Nested Jobs 是什么。
如果您使用启动进程 server.exe
启动进程 launcherA.exe
启动进程 subProcessA.exe
等等,您只需要在作业中启动 server.exe
。所有其他 child ( launcherA.exe
、 subProcessA.exe
等)将在与他的 parent 相同的工作中自动启动。因此,您可以一次监视所有进程集合。例如,您甚至可以在新进程的每次启动时收到通知,以创建详细的日志文件。我在一些应用程序上这样做了,效果很好。
您可以收到的唯一问题是,如果来自子 exe 的一些也“足够现代”并使用乔布斯来控制他的 child 。只有在您必须使用新的嵌套作业的情况下。
如果我理解正确您的问题,您当前的问题可以通过将 server.exe
仅放在新工作中来简单解决。
关于c++ - 如何在没有嵌套作业对象的情况下可靠地控制子进程生命周期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10316848/