如果一个程序是由 system() 或 CreateProcess() 从另一个程序启动的,如何防止 Ctrl+Break/Ctrl+C 关闭这两个程序?
Posted
技术标签:
【中文标题】如果一个程序是由 system() 或 CreateProcess() 从另一个程序启动的,如何防止 Ctrl+Break/Ctrl+C 关闭这两个程序?【英文标题】:how to prevent Ctrl+Break/Ctrl+C from closing both programs if one was launched from another by system() or CreateProcess()? 【发布时间】:2012-06-03 19:14:11 【问题描述】:这是测试示例:
(1)。做无限循环的简单程序:
#include <iostream>
using namespace std;
int main()
int counter = 0;
while (1) cout << ++counter << ": endless loop..." <<endl;
(2)。另一个通过system()
命令启动上述示例的程序:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
system("endless_loop.exe");
cout << "back to main program" << endl;
在此程序上执行Ctrl+Break
时,back to main program
不显示。
如何将此组合键限制在进程内部并将执行指针返回到主应用程序?
另一件事是我并不总是能够控制内部程序的源代码,所以我无法在那里更改。
【问题讨论】:
你不能在两个程序中为 SIGINT 注册不同的信号处理程序吗?这已经讨论过here。 您需要将已启动的程序与控制台分离。最好使用 CreateProcess 和 DETACHED_PROCESS 选项。未由 CRT 以其他方式包装。 @Hans:我希望 DETACHED_PROCESS 会导致控制中断仍然中断父进程而不是子进程,这与 OP 试图实现的完全相反。 【参考方案1】:添加这个::
#include <signal.h>
...
signal (SIGINT, SIG_IGN);
在signal()
调用之后,程序会忽略 Ctrl-Break。在 Linux 上,忽略信号通过fork()
/exec()
传播到子进程。
由于 O/S + 运行时库的工作方式,我希望 Windows 重置 exec()
上的默认信号处理。因此,如果您希望孩子忽略 Break,请将上面的代码也添加到其中。
【讨论】:
以上是关于如果一个程序是由 system() 或 CreateProcess() 从另一个程序启动的,如何防止 Ctrl+Break/Ctrl+C 关闭这两个程序?的主要内容,如果未能解决你的问题,请参考以下文章