如何在 unix 中处理 SIGABRT 信号

Posted

技术标签:

【中文标题】如何在 unix 中处理 SIGABRT 信号【英文标题】:How to handle SIGABRT signal in unix 【发布时间】:2011-05-03 09:43:00 【问题描述】:

我在运行下面的程序时得到核心转储:

$ cat test2.c

#include <stdio.h>
#include <stdlib.h>


void main()


abort();



$

$ cc -o test2 test2.c
"test2.c", line 5: warning #2951-D: return type of function "main" must be
          "int"
  void main()
       ^

$ ./test2
Abort(coredump)
$

我收到了一个 SIGABRT 信号。请建议我处理此 SIGABRT 信号的方法。

【问题讨论】:

en.wikipedia.org/wiki/SIGABRT 【参考方案1】:

从您的主目录中删除 abort()... 如果你想离开主要:return; 如果你想在任何地方离开程序:exit()

如果您真的想处理信号,请安装信号处理程序 见:http://www.manpagez.com/man/2/sigaction/

马里奥

【讨论】:

【参考方案2】:

您通常不应该处理它,调用 abort() 的目的是产生核心转储并终止您的程序,就像您的程序一样。

【讨论】:

【参考方案3】:
// here's same code w/signal handler
$ cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void abort_handler(int);

void main()

    if (signal(SIGABRT, abort_handler) == SIG_ERR) 
        fprintf(stderr, "Couldn't set signal handler\n");
        exit(1);
    
    abort();
    exit(0);


void abort_handler(int i)

    fprintf(stderr, "Caught SIGABRT, exiting application\n");
    exit(1);

$ cc -o test test.c
$ ./test
Caught SIGABRT, exiting application
$ 

【讨论】:

请注意,您可以处理 SIGABRT,但不能阻止进程终止(和转储) 我不知道该语句在多大程度上依赖于系统,在我编译并运行上述代码的系统上,没有转储内核。 $ uname -a Linux nas 2.6.32-30-generic #59-Ubuntu SMP Tue Mar 1 21:30:46 UTC 2011 x86_64 GNU/Linux 查看 man 信号,以及 man 7 信号

以上是关于如何在 unix 中处理 SIGABRT 信号的主要内容,如果未能解决你的问题,请参考以下文章

UNIX信号

如何获取已向已退出转储核心的另一个进程发送 SIGABRT 信号的进程的 pid

如何在 Linux 内核中找到信号处理程序定义?

线程 1:信号 sigabrt。不知道如何解决这个问题

C++ 信号处理 signal(SIGINT, signalHandler);

软件开发入门教程网之​​C++ 信号处理