一、格式
#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);
}