APUE编程:83---信号处理(SIGABRT信号与abort函数)

一、格式

#include <stdlib.h>
void abort(void);
  • 此函数不返回

二、功能与特点

功能:abort函数将SIGABRT信号发送给调用进程,向主机环境递送一个未成功终止的通知

特点:

  • abort就是调用raise(SIGABRT)
  • abort并不会理会进程对SIGABRT信号的阻塞和忽略
  • ANSI C要求若捕捉到此信号而且相应信号处理程序返回, abort仍不会返回到其调用者

为什么使用abort和SIGABRT信号?

  • 原因:在进程终止之前由abort执行所需的清除操作

进程捕获到SIGABRT信号之后会做什么?

  • 情景一:若有信号处理函数,则在处理函数中调用exit、_exit、_Exit、longjmp、siglongjmp
  • 情景二:如果进程并不在信号处理函数中终止自己,则当信号处理函数返回时,abort终止程序
  • 情景三:没有处理函数,直接使程序异常终止

其他注意事项:

三、abort函数的实现

  •  下面是按POSIX.1说明实现的
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void abort(void)
{
    sigset_t mask;
    struct sigaction action;

    sigaction(SIGABRT, NULL, &action);
    if (action.sa_handler == SIG_IGN) {
        action.sa_handler = SIG_DFL;
        sigaction(SIGABRT, &action, NULL);
    }
    if (action.sa_handler == SIG_DFL)
        fflush(NULL);

    sigfillset(&mask);
    sigdelset(&mask, SIGABRT);
    sigprocmask(SIG_SETMASK, &mask, NULL);
    kill(getpid(), SIGABRT);

    fflush(NULL);
    action.sa_handler = SIG_DFL;
    sigaction(SIGABRT, &action, NULL); 
    sigprocmask(SIG_SETMASK, &mask, NULL);
    kill(getpid(), SIGABRT);
    exit(1);
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值