【发布时间】:2016-10-25 06:24:25
【问题描述】:
我在一棵树中有 3 个进程:A -> B -> C。A 是我不拥有的主机应用程序,它调用 CreateProcess 和 dwCreationFlags = 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