我想运行任意基于控制台的子流程,并从单个主流程管理它们.基于控制台的子进程通过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块.)有什么好方法可以做我想要的吗?我可以看到理论上我可以在第一次尝试的基础上建立并找到其他方法在进程之间进行通信,但我担心它会变得非常尴尬.是否有其他程序可以达到同样效果的好例子?它似乎很简单,不能满足所有这一要求.
我不知道管理/重定向标准输入等。等,但是为了管理子进程树\n您是否考虑过使用 Windows作业对象api?
\n\n还有其他几个关于管理进程树的问题(How do Iautomatic destroy child process in Windows? Performing equal to \xe2\x80\x9cKill Process Tree\xe2\x80\x9d in c++ on windows),它看起来像是最干净的方法,如果你可以使用它。
\n\nJeffery Richter 的《Windows Via C/C++》第 5 章对使用 CreateJobObject 和相关 API 进行了很好的讨论。
\n| 归档时间: |
|
| 查看次数: |
2035 次 |
| 最近记录: |