3

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

我添加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;
}

正如 Gregory 所建议的那样,该程序仍然毫不客气地退出而没有停止用户输入。

更新 2:我不确定是什么做的,但代码现在可以正常工作。谢谢大家的帮助。

4

1 回答 1

8

来自 MSDN:

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

这意味着您将不得不使用预处理指令并实施特定于 Windows 的解决方案

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

在你开始的main时候

SetConsoleCtrlHandler(handler, TRUE);
于 2010-01-09T00:33:54.837 回答