此表列出了 POSIX 保证异步信号安全的所有函数,因此可以从信号处理程序中调用。
通过使用该表中的“写入”命令,以下相对“丑陋”的解决方案有望解决问题:
#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 信号编程简介  
 
- 扩展传统信号