C++: продолжить выполнение после SIGINT

Хорошо, я пишу программу, которая выполняет довольно тяжелый анализ, и я хотел бы иметь возможность быстро ее остановить.

я добавил signal(SIGINT, terminate); к началу основного и определенного конца, как:

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 ответ

Решение

Из 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);
Другие вопросы по тегам