如果一个程序是由 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 关闭这两个程序?的主要内容,如果未能解决你的问题,请参考以下文章

react实战—creat-react-app

C#WinForm项目怎么转变成WPF项目?

Java 方法

关于System.InvalidOperationException异常

C语言源程序是由啥构成的

怎么修改Xcode新项目或新文件最上面的Creat By XXX