这是我为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;
}
Run Code Online (Sandbox Code Playgroud)
计划产出:

Ant*_*hys 15
正如其他人所说,你不能让abort()返回并允许执行正常继续.然而,你可以做的是保护一段代码,这些代码可能通过类似于try catch的结构来调用abort.代码的执行将被中止,但程序的其余部分可以继续.这是一个演示:
#include <csetjmp>
#include <csignal>
#include <cstdlib>
#include <iostream>
jmp_buf env;
void on_sigabrt (int signum)
{
signal (signum, SIG_DFL);
longjmp (env, 1);
}
void try_and_catch_abort (void (*func)(void))
{
if (setjmp (env) == 0) {
signal(SIGABRT, &on_sigabrt);
(*func)();
signal (SIGABRT, SIG_DFL);
}
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);
}
Run Code Online (Sandbox Code Playgroud)
虽然您可以替换处理程序SIGABRT并且abort()会关注处理程序,但只有在信号处理程序不返回时才会禁止中止.C99中的相关报价见7.20.4.1第2段:
除非信号SIGABRT被捕获且信号处理程序没有返回,否则中止函数会导致程序异常终止....
您的信号处理程序确实返回,因此程序中止.