我为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
找不到核心。甚至过程也没有终止。
如果没有用户定义的信号处理程序,则生成核心。
答案 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()
将处理其余的事情。