首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用信号中止功能实现

使用信号中止功能实现
EN

Stack Overflow用户
提问于 2014-06-05 10:14:29
回答 1查看 608关注 0票数 3

下面是在“Unix高级编程”中给出的使用abort实现signals功能的示例。在下面的代码中几乎没有疑问-

代码语言:javascript
运行
复制
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 */
    sigprocmask(SIG_SETMASK, &mask, NULL);
    kill(getpid(), SIGABRT);    /* send the signal */ **STEP 1**

    /*
     * 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 */ **STEP 2**
    exit(1);    /* this should never be executed ... */
}

问题

当我们用kill (用步骤1标记)发送第一个SIGABRT时,为什么我们期望代码继续到下一行呢?(参见注释-‘如果我们在这里,进程捕获SIGABRT并返回’)

为什么我们需要再次传送kill信号(在第二步中),然后exit(1)就不会被击中。(请参阅代码中的注释)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 10:19:57

大多数程序在SIGABRT上没有什么特别之处。

但是一些奇怪的程序可以在SIGABRT上安装自己的信号处理程序,而且abort函数仍然可以工作,甚至对它们来说也是如此。

因此,大多数-those不捕获SIGABRT的程序不会超过步骤1(因为SIGABRT的默认行为是转储核心,根据信号(7) .)。

少数几个捕获SIGABRT的程序将一直运行到第二步(如果调用您的abort)。此时,SIGABRT的默认行为已经重新安装。因此,程序转储核心在步骤2。最后的exit(1)无法到达。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24057420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档