Tôi đang chuyển một chương trình Linux/gcc trong các cửa sổ và thực hiện xử lý ngoại lệ chung cho cả hai. Tôi đã tự hỏi điều gì sẽ tương đương với tín hiệu SIGINT
cho MinGW/gcc.Tương đương với tín hiệu "SIGINT" (posix) để bắt "CTRL + C" trong Windows/MinGW
Dưới đây là cách tôi xử lý nó dưới Linux:
static void handler(int sig)
{
// Catch exceptions
switch(sig)
{
case SIGABRT:
fputs("Caught SIGABRT: usually caused by an abort() or assert()\n", stderr);
break;
case SIGFPE:
fputs("Caught SIGFPE: arithmetic exception, such as divide by zero\n",
stderr);
break;
case SIGILL:
fputs("Caught SIGILL: illegal instruction\n", stderr);
break;
case SIGINT:
fputs("Caught SIGINT: interactive attention signal, probably a ctrl+c\n",
stderr);
break;
case SIGSEGV:
fputs("Caught SIGSEGV: segfault\n", stderr);
break;
case SIGTERM:
default:
fputs("Caught SIGTERM: a termination request was sent to the program\n",
stderr);
break;
}
// Ctrl+C interrupt => No backtrace
if (sig != (int)SIGINT)
{
fprintf(stderr, "Error: signal %d:\n", sig);
posix_print_stack_trace();
}
exit(sig);
}
signal(SIGABRT, handler);
signal(SIGFPE, handler);
signal(SIGILL, handler);
signal(SIGINT, handler);
signal(SIGSEGV, handler);
signal(SIGTERM, handler);
Dưới Windows, điều này có vẻ như:
static LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS * ExceptionInfo)
{
switch(ExceptionInfo->ExceptionRecord->ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
fputs("Error: EXCEPTION_ACCESS_VIOLATION\n", stderr);
break;
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
fputs("Error: EXCEPTION_ARRAY_BOUNDS_EXCEEDED\n", stderr);
break;
case EXCEPTION_BREAKPOINT:
fputs("Error: EXCEPTION_BREAKPOINT\n", stderr);
break;
...
}
}
if (EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode)
{
windows_print_stacktrace(ExceptionInfo->ContextRecord);
}
Vấn đề của tôi là tôi không thấy bất kỳ tương đương với SIGINT
trong EXCEPTION_*
có sẵn cho Windows.
Làm cách nào để bắt gặp sự gián đoạn "CTRL + C" trong Windows (MinGW/gcc)?
Cảm ơn rất nhiều.
Vẫn còn SIGINT, trong Microsoft CRT. SIGBREAK cho tổ hợp phím Ctrl + Break. Và không, điều này không đi qua gọi lại được cài đặt cho SetUnhandledException(). Nó không phải là unhandled :) SetConsoleCtrlHandler() để có được một cái nhìn sớm vào nó. –