В этой таблице перечислены все функции, которые POSIX гарантирует, что они безопасны для асинхронного сигнала и могут вызываться из обработчика сигнала.
Используя команду 'write' из этой таблицы, можно надеяться, что следующее относительно "уродливое" решение подойдет:
#include <csignal>
#ifdef _WINDOWS_
#define _exit _Exit
#else
#include <unistd.h>
#endif
#define PRINT_SIGNAL(X) case X: \
write (STDERR_FILENO, #X ")\n" , sizeof(#X ")\n")-1); \
break;
void catchSignal (int reason) {
char s[] = "Caught signal: (";
write (STDERR_FILENO, s, sizeof(s) - 1);
switch (reason)
{
// These are the handlers that we catch
PRINT_SIGNAL(SIGUSR1);
PRINT_SIGNAL(SIGHUP);
PRINT_SIGNAL(SIGINT);
PRINT_SIGNAL(SIGQUIT);
PRINT_SIGNAL(SIGABRT);
PRINT_SIGNAL(SIGILL);
PRINT_SIGNAL(SIGFPE);
PRINT_SIGNAL(SIGBUS);
PRINT_SIGNAL(SIGSEGV);
PRINT_SIGNAL(SIGTERM);
}
_Exit (1); // 'exit' is not async-signal-safe
}
РЕДАКТИРОВАТЬ: Здание на окнах.
После попытки построить это одно окно, кажется, что 'STDERR_FILENO' не определено. Однако из документации его значение, по-видимому, равно 2.
#include <io.h>
#define STDIO_FILENO 2
РЕДАКТИРОВАТЬ: 'обработчик' также не должен вызываться из обработчика сигнала!
Как указывает fizzer , вызов _Exit в вышеприведенном подходе является кувалдой для таких сигналов, как HUP и TERM. В идеале, когда эти сигналы перехвачены, можно использовать флаг типа «volatile sig_atomic_t», чтобы уведомить основную программу о том, что она должна выйти.
Следующее, что я нашел полезным в своих поисках.
- Введение в программирование сигналов Unix
- Расширение традиционных сигналов