我想运行任意基于控制台的子进程,并从一个主进程管理它们。基于控制台的子进程通过stdin、stdout和stderr进行通信,如果您在一个真正的控制台中运行它们,当您按下CTRL+C时,它们会干净地终止。其中一些子进程实际上可能是一个进程树,例如运行一个可执行文件的批处理脚本,该可执行文件又可以运行另一个可执行文件来执行某些工作。我想重定向他们的标准I/O(例如,这样我就可以在GUI窗口中显示他们的输出),并且在某些情况下给他们发送一个CTRL+C事件,这样他们就会放弃并干净地终止。
应接收CTRL+C事件。
(来源:
livejournal.com
另外,我更希望没有额外的窗口对用户可见。
以下是我尝试过的方法(请注意,我使用的是Python,但针对C的解决方案仍然有用):
-
生成一个额外的中间进程
CREATE_NEW_CONSOLE
GenerateConsoleCtrlEvent
(
CTRL_C_EVENT
,0)当我们要杀死工作人员时。不幸的是,
创建新的控制台
-
生成一个额外的中间进程
CREATE_NEW_PROCESS_GROUP
发电机电磁阀
(
,0)当我们要杀死工作人员时。不知何故,它成功地发送了CTRL+C
只有
对主进程来说,这完全没有用。在仔细检查时,GenerateCollectLevent表示无法将CTRL+C发送到流程组。
-
生成子进程
新建流程组
. 然后打电话
(
CTRL_BREAK_EVENT
,pid)杀死工人。这并不理想,因为CTRL+BREAK不如CTRL+C友好,而且可能会导致更混乱的终止。(例如,如果是Python进程,则无法捕获键盘中断,也不会运行finally块。)
有什么好方法可以做我想做的吗?我知道我可以