abort(3)
使程序异常终止,将SIGABRT信号发送给调用进程(进程不应忽略)
ISO C规定,调用它将向主机环境递送一个未成功终止的通知,即调用 raise(SIGABRT)
而 raise(3) 等价于:
单线程: kill(getpid(), signo);
多线程; pthread_kill(pthread_self(), signo);
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void abort(void)
{
sigset_t mask;
struct sigaction action;
/* caller can't ignore the SIGABRT, if so reset to default */
if (action.sa_handler == SIG_IGN) {
action.sa_handler = SIG_DFL;
sigaction(SIGABRT, &action, NULL);
}
if (action.sa_handler == SIG_DFL)
fflush(NULL); //flush all iostream
/* caller can't block SIGABRT, make sure */
sigfillset(&mask);
sigdelset(&mask, SIGABRT);
if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0)
perror("sigprocmask");
/* raise SIGABRT for the caller, handler return before kill() return */
kill(getpid(), SIGABRT);
/* process caught SIGABRT and returned */
fflush(NULL);
action.sa_handler = SIG_DFL;
sigprocmask(SIG_SETMASK, &mask, NULL);
kill(getpid(), SIGABRT);
exit(1);
}
system(3)
使用system(3)执行一个shell指令
通常使用system(3)而不是fork(2) exec(3) (实际上是execve(2)),因为system完善了出错和信号处理机制