使用CREATE_NEW_PROCESS_GROUP创建主机时,向子进程发送Ctrl+C

Send Ctrl+C to child process when host was created with CREATE_NEW_PROCESS_GROUP

本文关键字:子进程 Ctrl+C 主机 NEW CREATE PROCESS GROUP 创建 使用      更新时间:2023-10-16

我在一棵树上有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信号将对新进程组中的所有进程禁用。

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

谢谢Harry的建议!对我有用的是:

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

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