linux - SIGABRT处理程序。崩溃前进行一些清理

原文 标签 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);

问题:
abort()调用sighandler会发出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中止(3)手册页:
如果sigabrt信号被忽略,或被返回的处理程序捕获,
函数的作用仍然是终止进程。它通过
恢复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

找不到核心。即使进程没有终止。
如果没有用户定义的信号处理程序,则生成core。

最佳答案

在第二次捕获之前,可以还原默认的sigabrt行为:

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

相关文章:

c - 用于C守护程序的多对一IPC

linux - 程序如何相互通信?

python - Python Linux dmidecode,如何通过解析获取硬件信息?

linux - 如何在Openldap复制(synrepl)中使用slapadd添加条目

linux - 了解Linux中的SMP概念

linux - Shell脚本 - 如果变量为null或为空,则退出脚本

c - 通过共享内存共享指针

linux - Linux中的_splitpath

c# - 在Linux上编译C#+ WPF以便在Windows上运行

linux - 错误:缺少依赖项:软件包ambari-server-1.7.0-169.noarch需要python> = 2.6