SIGABRT处理程序。在崩溃之前做一些清理工作

时间:2014-05-19 11:18:40

标签: linux unix ipc sigabrt

我为SIGABRT信号添加了一个sighandler。

abort()的默认行为是生成核心转储。

我想在信号处理程序中做同样的事情,但在崩溃之前,执行清理代码。

我试过如下,我知道下面的代码不起作用。

static void
proc_sigabort_handler (int signo UNUSED)
{
    /* cleanup */
    abort(); /* This is to coredump */
}

signal(SIGABRT, proc_sigabort_handler);

问题: 在{sighandler}中abort()调用会引发SIGABRT信号,并以相同的sighandler函数结束,这样就可以了。

是否存在类似于abort()的系统调用以生成核心转储?

在回复后编辑:

user@srv1 ~/linux>  uname -a

Linux srv1 2.4.21-63.ELsmp #1 SMP Wed Oct 28 23:15:46 EDT 2009 i686 i686 i386 GNU/Linux

Linux abort(3)man Page:

  

如果SIGABRT信号被忽略,或被返回的处理程序捕获,   abort()函数仍将终止进程。它通过这样做   恢复SIGABRT的默认处置,然后提高   再次发出信号。

例如:

void mysigabort()
{
    printf("I caught the SIGABRT signal!\n");/* I know that printf should be avoided */
    return;    
} 

int main()
{
    signal(SIGABRT, mysigabort);

    while(1);  /* infinite loop */

    exit(0);
}

产地:

user@srv1 ~/linux>  ./a.out

I caught the SIGABRT signal!

<cursor>


user@srv1 ~/linux>  kill -6 25208

找不到核心。甚至过程也没有终止。

如果没有用户定义的信号处理程序,则生成核心。

2 个答案:

答案 0 :(得分:3)

您可以在第二次捕获之前恢复默认的SIGABRT行为:

void mysigabort(int signum)
{
    // whatever you want
    signal(signum, SIG_DFL);
    kill(getpid(), signum); // or abort() ?
}

答案 1 :(得分:2)

来自Linux上的abort手册页:

  

如果SIGABRT信号被忽略,或被返回的处理程序捕获,则abort()   功能仍将终止该过程。它通过恢复默认的dis-   SIGABRT的位置,然后第二次提升信号。

OP Ram指出这是特定于Linux的,但在那里,您只需从信号处理程序返回 - 无需再次调用abort()。 libc的abort()将处理其余的事情。