如下所示代码,当截取信号时(已设定ulimit -c unlimited), 在signalProcess()中有三种处理办法,导致三种结果
1:进程不会结束,会不停地调用 crashHandler(段错误信号),因为信号没有被处理
2:进程结束,但是不会产生coredump
3: 处理信号后,将信号恢复为内核默认处理,会产生coredump文件,并结束进程
void signalProcess(int signalval)
{
//以下代码三选一:
//什么都不做或者return //1:
//exit(1); //2:
//signal(signalval, SIG_DFL); //3
}
void signalRegister(void)
{
signal(SIGKILL, signalProcess);//执行非法指令
signal(SIGSEGV, signalProcess);//段错误
signal(SIGFPE, signalProcess );//算术运算错误
signal(SIGBUS, signalProcess );//非法地址
signal(SIGSYS, signalProcess );//非法系统调用
signal(SIGABRT ,signalProcess);//调用abort函数
signal(SIGTERM, signalProcess);//程序结束
signal(SIGINT, signalProcess);//ctrl-c
signal(SIGQUIT, signalProcess);//ctrl-c
}
int main(void)
{
signalRegister();
// Logger::setLogFile("test.log");
LOG_WARNING("WARN\n");
LOG_DEBUG("DEBUG\n");
while (bRun){
char *p = NULL;
memset(p, 0u, 1);
sleep(1);
}
return 0;
}
正确的处理方式
void signalProcess(int signalval)
{
signal(signalval, SIG_DFL); //必须放在第一行,否则coredump堆栈显示的地址会对应不上
LOG_WARNING("signal:%d\n", signalval);
LOG_CLOSE();
if ((SIGINT == signalval)
|| (SIGQUIT == signalval)
|| (SIGTERM == signalval)
|| (SIGABRT == signalval)) {
exit(0); //正常退出
}
//或者
bRun = false;
}