C ++:在SIGINT之后继续执行

时间:2010-01-09 00:28:05

标签: c++ windows signals copy-paste sigint

好的,我正在编写一个程序正在进行一些非常繁重的分析,我希望能够快速停止它。

我将signal(SIGINT, terminate);添加到main的开头并定义了终止,如:

void terminate(int param){
   cout << endl << endl << "Exit [N]ow, or [A]fter this url?" << endl;
   std::string answer;
   cin >> answer;
   if(answer[0] == 'n' || answer[0] == 'N'){
      terminateParser();
      exit(1);
   }else if(answer[0] == 'a' || answer[0] == 'A'){
      quitAfterUrl = true;
   }
}

在linux中,这就像我预期的那样,就是它等待用户输入。但是当我尝试在Windows中执行相同操作时,它会显示消息并退出。

有没有办法阻止SIGINT立即关闭程序?

更新

当我尝试

BOOL WINAPI handler(DWORD dwCtrlType)
{
  if (CTRL_C_EVENT == dwCtrlType)
  {
    // ask the user
  }
  return FALSE;
}
正如格雷戈里建议的那样,该程序仍然毫不客气地退出而没有停止用户输入。

更新2: 我不确定它做了什么,但代码现在正在运行。谢谢大家的帮助。

1 个答案:

答案 0 :(得分:8)

From MSDN:

  

注意任何Win32应用程序都不支持SIGINT,包括Windows 98 / Me和Windows NT / 2000 / XP。当发生CTRL + C中断时,Win32操作系统会生成一个新线程来专门处理该中断。这可能导致UNIX等单线程应用程序变为多线程,从而导致意外行为。

这意味着您必须使用预处理指令并实现Windows specific solution

BOOL WINAPI handler(DWORD dwCtrlType)
{
  if (CTRL_C_EVENT == dwCtrlType)
  {
    // ask the user
  }
  return FALSE;
}

main开始时你做

SetConsoleCtrlHandler(handler, TRUE);