如何处理SIGABRT信号?

时间:2012-01-19 23:25:54

标签: c++ signals

以下是我为SIGABRT信号设置处理程序的代码,然后我调用abort()但处理程序没有被触发,而程序被中止,为什么?

#include <iostream>
#include <csignal>
using namespace std;
void Triger(int x)
{
    cout << "Function triger" << endl;
}

int main()
{
    signal(SIGABRT, Triger);
    abort();
    cin.ignore();
    return 0;
}

计划输出:

enter image description here

3 个答案:

答案 0 :(得分:14)

正如其他人所说,你不能让abort()返回并允许执行正常继续。然而,你可以做的是保护一段可能通过类似于try catch的结构调用abort的代码。代码的执行将被中止,但程序的其余部分可以继续。这是一个演示:

#include <csetjmp>
#include <csignal>
#include <cstdlib>
#include <iostream>

jmp_buf env;

void on_sigabrt (int signum)
{
  longjmp (env, 1);
}

void try_and_catch_abort (void (*func)(void))
{
  if (setjmp (env) == 0) {
    signal(SIGABRT, &on_sigabrt);
    (*func)();
  }
  else {
    std::cout << "aborted\n";
  }
}    

void do_stuff_aborted ()
{
  std::cout << "step 1\n";
  abort();
  std::cout << "step 2\n";
}

void do_stuff ()
{
  std::cout << "step 1\n";
  std::cout << "step 2\n";
}    

int main()
{
  try_and_catch_abort (&do_stuff_aborted);
  try_and_catch_abort (&do_stuff);
}

答案 1 :(得分:7)

虽然你可以替换SIGABRT的处理程序而abort()会注意处理程序,但只有在信号处理程序没有返回时才会禁止中止。 C99中的相关引用见7.20.4.1第2段:

  

中止函数会导致程序异常终止,除非信号SIGABRT被捕获且信号处理程序没有返回。 ...

您的信号处理程序确实返回,因此程序被中止。

答案 2 :(得分:2)

你得到那些症状,即弹出调试对话框,当你有一个调试版本时(使用windows和Visual Studio-我正在测试2012版本),因为它设置了一个调试中断,在abort()的调试实现中)。 如果你选择“忽略”,你会收到“功能三元组”的消息

如果您执行发布版本,那么您没有获得调试弹出对话框,并且您按预期获得了消息