使用CREATE_NEW_PROCESS_GROUP创建主机时,向子进程发送Ctrl+C
Send Ctrl+C to child process when host was created with CREATE_NEW_PROCESS_GROUP
我在一棵树上有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信号将对新进程组中的所有进程禁用。
我需要一种方法来绕过这种行为,这样我就可以发送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)
来工作,你只需要在添加一个真正的处理程序之前禁用默认处理程序。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 等待等待失效的子进程
- 使用CREATE_NEW_PROCESS_GROUP创建主机时,向子进程发送Ctrl+C