首页 > 其他 > 详细

信号之abort函数

时间:2014-01-16 00:07:28      阅读:439      评论:0      收藏:0      [点我收藏+]

abort函数的功能是使异常程序终止。

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

此函数将SIGABRT信号发送给调用进程(进程不应忽略此信号)。ISO C规定,调用abort将向主机环境递送一个未成功的终止通知,其方法是调用raise(SIGABRT)函数。

实例

程序清单10-18 abort的POSIX.1实现

bubuko.com,布布扣
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void
abort(void)    /* POSIX-style abort() function */
{
    sigset_t        mask;
    struct sigaction    action;
    
    /*
    * Caller can‘t ignore SIGABRT, if so reset to default.
    */
    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);        /* flush all open stdio streams */

    /*
    * Caller can‘t block SIGABRT; make sure it‘s unblocked.
    */
    sigfillset(&mask);
    sigdelset(&mask, SIGABRT);    /* mask has only SIGABRT turned off */
    sigprogmask(SIG_SETMASK, &mask, NULL);
    kill(getpid(), SIGABRT);    /* send the signal */

    /*
    * If we‘re here, process caught SIGABRT and returned.
    */
    fflush(NULL);            /* flush all open stdio streams. */
    action.sa_handler = SIG_DFL;
    sigaction(SIGABRT, &action, NULL);    /* reset to default */
    sigprocmask(SIG_SETMASK, &mask, NULL)    /* just in case ... */
    kill(getpid(), SIGABRT);        /* and one more time */
    exit(1);    /* this should never be executed ... */
}
bubuko.com,布布扣

首先查看是否执行默认动作,若是则冲洗所以标准I/O流。这并不等价于对所有打开的流调用fclose(因为只冲洗,并不关闭它们),但是当进程终止时,系统会关闭所有打开的文件。如果进程捕捉此信号并返回,那么因为进程可能产生了更多的输出,所以再一次冲洗所有的流。不进行冲洗处理的唯一条件是如果进程捕捉此信号,然后调用_exit或_Exit。在这种情况下,内存中任何未冲洗的标准I/O缓冲区都被丢弃。

如果调用kill使其为调用者产生信号,并且如果该信号是不被阻塞的(程序清单10-18保证做到这一点),则在kill返回前,该信号(或某个未决、未阻塞的信号)就被传送给了该进程(http://www.cnblogs.com/nufangrensheng/p/3514817.html)。我们阻塞出SIGABRT之外的所有信号,这样就可知如果对kill的调用返回了,则改进程一定已捕捉到该信号,并且也从该信号处理程序返回。

 

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

信号之abort函数

原文:http://www.cnblogs.com/nufangrensheng/p/3516629.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!