gpt4 book ai didi

windows - 在 Windows 上将 CTRL+C 发送到子进程树

转载 作者:可可西里 更新时间:2023-11-01 13:48:07 26 4
gpt4 key购买 nike

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

下面两张图首先展示了正常的结构——一个master进程有四个worker子进程,其中一些worker有自己的子进程;然后当其中一个 worker 需要停止时会发生什么 - 它和它的所有子进程都应该收到 CTRL+C 事件,但没有其他进程应该收到 CTRL+C 事件。

Process diagram
(来源:livejournal.com)

此外,我更希望没有额外的窗口对用户可见。

这是我尝试过的方法(请注意,我正在使用 Python,但 C 的解决方案仍然会有帮助):

  • 使用 CREATE_NEW_CONSOLE 产生一个额外的中间进程,然后让它产生工作进程。然后让它调用 GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0) 当我们想杀死 worker 时。不幸的是,CREATE_NEW_CONSOLE 似乎阻止我重定向标准 I/O channel ,所以我没有简单的方法将输出返回到主程序。
  • 使用 CREATE_NEW_PROCESS_GROUP 产生一个额外的中间进程,然后让它产生工作进程。然后让它调用 GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0) 当我们想杀死 worker 时。不知何故,这设法将 CTRL+C 发送到主进程,这是完全无用的。仔细检查后,GenerateConsoleCtrlEvent 表示无法将 CTRL+C 发送到进程组。
  • 使用 CREATE_NEW_PROCESS_GROUP 生成子进程。然后调用GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid) 杀死 worker 。这并不理想,因为 CTRL+BREAK 不如 CTRL+C 友好,可能会导致更困惑的终止。 (例如,如果它是一个 Python 进程,则不会捕获 KeyboardInterrupt 并且不会运行 finally block 。)

有什么好的方法可以做我想做的事吗?我可以看到我可以 理论上 建立在第一次尝试的基础上,并找到一些其他的方式来在进程之间进行通信,但我担心它会变得非常尴尬。是否有其他程序达到相同效果的好例子?它看起来很简单,不可能是一个不常见的要求。

最佳答案

我不知道管理/重定向 stdin 等。等,但用于管理子流程树您是否考虑过使用 Windows Job Objects接口(interface)?

关于管理进程树 ( 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 进行了很好的讨论。

关于windows - 在 Windows 上将 CTRL+C 发送到子进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1798771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com