代码之家  ›  专栏  ›  技术社区  ›  Weeble

按CTRL+C组合键发送到Windows子进程

  •  5
  • Weeble  · 技术社区  · 15 年前

    我想运行任意基于控制台的子进程,并从一个主进程管理它们。基于控制台的子进程通过stdin、stdout和stderr进行通信,如果您在一个真正的控制台中运行它们,当您按下CTRL+C时,它们会干净地终止。其中一些子进程实际上可能是一个进程树,例如运行一个可执行文件的批处理脚本,该可执行文件又可以运行另一个可执行文件来执行某些工作。我想重定向他们的标准I/O(例如,这样我就可以在GUI窗口中显示他们的输出),并且在某些情况下给他们发送一个CTRL+C事件,这样他们就会放弃并干净地终止。

    应接收CTRL+C事件。

    Process diagram
    (来源: 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块。)

    有什么好方法可以做我想做的吗?我知道我可以

    1 回复  |  直到 5 年前
        1
  •  1
  •   Community M-A    7 年前

    我不知道如何管理/重定向stdin等,但知道如何管理子进程树 你考虑过用窗户吗 Job Objects 应用程序编程接口?

    How do I automatically destroy child processes in Windows? Performing equivalent of “Kill Process Tree” in c++ on windows )如果你能用的话,它看起来是最干净的方法。

    第5章 Windows Via C/C++ by Jeffery Richter 讨论了如何使用CreateJobObject和相关的API。