MinTTY, похоже, не передает сигнал моей программе mingw-w64, когда я нажимаю CTRL+C. В CMD с той же идентичной программой сигнал поднимается корректно. Почему это?
Программа скомпилирована под msys2 mingw-w64 с g++ -static -static-libstdc++ -std=c++14 -Wall -Wextra -pedantic testan.cpp
. В обоих случаях signal()
не возвращает SIG_ERR
, поэтому кажется, что обработчик установлен правильно.
код:
#include <chrono>
#include <thread>
#include <iostream>
#include <csignal>
using namespace std;
void signalHandler( int x ) {
cout << "Interrupt: " << x << endl;
exit( 123 );
}
int main () {
if( signal(SIGINT, signalHandler) == SIG_ERR )
cout << "received SIG_ERR" << endl;
while( true ) {
cout << "waiting for CTRL+C" << endl;
this_thread::sleep_for( 1s );
}
return 0;
}
мятный выход:
$ ./a.exe
waiting for CTRL+C
waiting for CTRL+C
waiting for CTRL+C
$
Вывод CMD:
C:\Users\Xunie\Desktop\project>a.exe
waiting for CTRL+C
waiting for CTRL+C
Interrupt: 2
C:\Users\Xunie\Desktop\project>
SIGINT
. Среда выполнения C эмулирует 6 необходимых сигналов плюсSIGBREAK
. Он имеет обработчик исключений ОС для эмуляцииSIGILL
,SIGSEGV
иSIGFPE
. Два только внутренние в среде выполнения:SIGABRT
иSIGTERM
. И в консольном приложении у него есть обработчик управления консолью, который отображаетCTRL_C_EVENT
вSIGINT
иCTRL_BREAK_EVENT
иCTRL_CLOSE_EVENT
вSIGBREAK
. - person Eryk Sun   schedule 22.05.2020