当前位置:  开发笔记 > 编程语言 > 正文

便携式捕获信号并向用户报告问题的方法

如何解决《便携式捕获信号并向用户报告问题的方法》经验,为你挑选了1个好方法。

如果由于某些奇迹在我们的程序中发生了段错误,我想要捕获SIGSEGV并让用户(可能是GUI客户端)知道一个返回码,发生了严重的问题.同时我想在命令行上显示信息以显示捕获的信号.

今天我们的信号处理程序如下:

void catchSignal (int reason) {
  std :: cerr << "Caught a signal: " << reason << std::endl;
  exit (1);
}

我可以听到上面的恐怖尖叫声,正如我从这个帖子中读到的那样,从信号处理程序中调用一个不可重入的函数是邪恶的.

是否有便携式方式处理信号并向用户提供信息?

编辑:或至少在POSIX框架内可移植?



1> Richard Cord..:

该表列出了POSIX保证异步信号安全的所有功能,因此可以从信号处理程序中调用.

通过使用此表中的'write'命令,以下相对"丑陋"的解决方案有望成功:

#include 

#ifdef _WINDOWS_
#define _exit _Exit
#else
#include 
#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
}

编辑:在Windows上构建.

在尝试构建这个窗口后,似乎未定义"STDERR_FILENO".然而,从文档中它的值似乎是'2'.

#include 
#define STDIO_FILENO 2

编辑:不应该从信号处理程序调用'exit'!

正如fizzer所指出的那样,在上面调用_Exit是一种用于HUP和TERM等信号的大锤方法.理想情况下,当捕获这些信号时,可以使用具有"volatile sig_atomic_t"类型的标志来通知主程序它应该退出.

以下我发现在我的搜索中很有用.

    Unix信号编程简介

    扩展传统信号

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有