Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73088
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 126
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-13 23:44
个人简介

信息安全出身、高性能流媒体服务器开发从业者、CDN、linux爱好者、HLS

文章分类

全部博文(14)

文章存档

2016年(14)

我的朋友

分类: LINUX

2016-08-06 23:28:12

通常服务器程序为了其能稳定持久地运行,会屏蔽一些比如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) |
给主人留下些什么吧!~~