【问题标题】:Send Ctrl+C to child process when host was created with CREATE_NEW_PROCESS_GROUP使用 CREATE_NEW_PROCESS_GROUP 创建主机时向子进程发送 Ctrl+C
【发布时间】:2016-10-25 06:24:25
【问题描述】:

我在一棵树中有 3 个进程:A -> B -> C。A 是我不拥有的主机应用程序,它调用 CreateProcessdwCreationFlags = CREATE_NEW_PROCESS_GROUP 来创建进程 B。B 是我的服务,C 是一个 Java 子进程,我想使用 CreateProcess 生成并能够发送 Ctrl+C 以触发关闭挂钩。

根据MSDN 上的进程创建标志页面,CREATE_NEW_PROCESS_GROUP 标志为所有子进程禁用 Ctrl+C:

新进程是新进程组的根进程。进程组包括作为该根进程的后代的所有进程。新进程组的进程标识符与进程标识符相同,在 lpProcessInformation 参数中返回。 GenerateConsoleCtrlEvent 函数使用进程组来启用向一组控制台进程发送 CTRL+BREAK 信号。如果指定此标志,将为新进程组中的所有进程禁用 CTRL+C 信号。

我需要一种绕过此行为的方法,以便我可以向进程 C 发送 Ctrl+C 信号。可以发送 Ctrl+Break 但还不够,因为这是一个 Java 进程并且 Ctrl+Break 不会触发关闭。我尝试使用CREATE_NEW_CONSOLE 创建进程 C,并假设这将允许新控制台接收所有信号,但 Ctrl+C 也被阻止在那里。有谁知道是否有某种方法可以覆盖或绕过CREATE_NEW_PROCESS_GROUP 并取消此 Ctrl+C 阻止?

【问题讨论】:

  • 您是否尝试过调用SetConsoleCtrlHandler 为进程B 显式启用Control-C 处理? (该设置是可继承的。)

标签: java c++ windows process console


【解决方案1】:

感谢哈利的建议!对我有用的是以下内容:

SetConsoleCtrlHandler(null, false);
SetConsoleCtrlHandler(MyActualHandler, true);

看起来进程组的事情是通过调用SetConsoleCtrlHandler(null, true) 来工作的,你只需要在添加一个真正的处理程序之前禁用默认处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多