假设我有一个只产生一个子进程的进程.现在,当父进程因任何原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死掉.如何正确地做到这一点?
stackoverflow上的一些类似问题:
关于Windows的 stackoverflow的一些类似问题:
有没有办法确保所有创建的子进程在Python程序的退出时间都死了?通过子进程,我指的是使用subprocess.Popen()创建的.
如果没有,我应该迭代所有发出的杀戮然后杀死-9?什么更干净?
您这样做AssignProcessToJobObject并且失败并显示"拒绝访问",但仅当您在调试器中运行时才会失败.为什么是这样?
我想运行任意基于控制台的子流程,并从单个主流程管理它们.基于控制台的子进程通过stdin,stdout和stderr进行通信,如果在真正的控制台中运行它们,则在按CTRL + C时它们会完全终止.其中一些实际上可能是一个进程树,例如运行可执行文件的批处理脚本,该可执行文件又可以运行另一个可执行文件来完成某些工作.我想重定向他们的标准I/O(例如,以便我可以在GUI窗口中显示他们的输出)并且在某些情况下向他们发送CTRL + C事件,以便他们放弃并彻底终止.
以下两个图首先显示了正常结构 - 一个主进程有四个工作子进程,其中一些有自己的子进程; 然后当其中一个工作人员需要被停止时应该发生什么 - 它和它的所有孩子应该得到CTRL + C事件,但没有其他进程应该收到CTRL + C事件.
流程图http://pics.livejournal.com/clockworksaint/pic/0007z5yr/s640x480.png
此外,我更希望用户看不到额外的窗口.
这是我尝试过的(注意我在使用Python,但C的解决方案仍然有用):
CREATE_NEW_CONSOLE,然后让它产生工作进程.然后在我们要杀死worker时调用GenerateConsoleCtrlEvent(CTRL_C_EVENT,0).不幸的是,CREATE_NEW_CONSOLE似乎阻止我重定向标准I/O通道,所以我没有简单的方法将输出返回到主程序.CREATE_NEW_PROCESS_GROUP,然后让它产生工作进程.然后在我们要杀死worker时调用GenerateConsoleCtrlEvent(CTRL_C_EVENT,0).不知何故,此管理对CTRL + C发送只到主过程,这是完全无用的.仔细观察,GenerateConsoleCtrlEvent表示无法将CTRL + C发送到进程组.CREATE_NEW_PROCESS_GROUP.然后调用GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,pid)来杀死worker.这并不理想,因为CTRL + BREAK不如CTRL + C友好,可能会导致终止混乱.(例如,如果它是一个Python进程,则不能捕获KeyboardInterrupt并且不会运行finally块.)有什么好方法可以做我想要的吗?我可以看到理论上我可以在第一次尝试的基础上建立并找到其他方法在进程之间进行通信,但我担心它会变得非常尴尬.是否有其他程序可以达到同样效果的好例子?它似乎很简单,不能满足所有这一要求.