gpt4 book ai didi

c++ - 如何处理SIGABRT信号?

转载 作者:可可西里 更新时间:2023-11-01 17:04:21 27 4
gpt4 key购买 nike

这是我为 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

最佳答案

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

#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);
}

关于c++ - 如何处理SIGABRT信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8934879/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com