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 ответ
Примечание. 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);