通常服务器程序为了其能稳定持久地运行,会屏蔽一些比如SIGQUIT之类的信号,具体做法大概如下所示:
#include
#include
#include
void handle_signal()
{
printf("recv SIGQUIT.\n");
exit(1);
}
int handle_exit()
{
printf("exit normally.\n");
return 2;
}
int main()
{
printf("program start from here.\n");
//设置信号的处理函数,当然真的要屏蔽的话可以这样
signal(SIGQUIT, SIG_IGN);
signal(SIGQUIT, handle_signal);
//处理函数
exit(handle_exit());
return 0;
}
但是,最近遇到过即使设置了对应信号的处理函数,同样地也有可能因为该信号产生coredump
下面的coredump就是上面的程序产生的,gdb进去可以看出就是信号SIGQUIT产生的。
这是为什么呢?其实可以从堆栈来看,这些函数是在整个程序的main函数之前(可以通过gdb下断点来验证),
这个时候整个程序还未设置对信号SIGQUIT的处理,所以如果这个时候收到了信号SIGQUIT,整个程序自然而然就会退出产生coredump
下面来验证:
注:确保能够验证成功,先执行ulimit -c unlimited
此时去目录下看就会看到coredump文件已经产生
这个问题当然在生产环境中不会出现,也很难出现。不知道有没有办法解决,如遇大神请多指点
阅读(2212) | 评论(0) | 转发(0) |