5. sigaction 函数
程序异常退出大部分都是系统发出的信号导致的,程序收到某些信号退出时,会产生core文件,如段错误信号SIGSEGV;但是某些信号不会产生,core文件,程序收到此类信号默认退出,排查这类问题时,会抓不到方向。
因此有必要对这类信号,进行捕获并记录日志。linux有一套处理信号的API。
样例
#include <signal.h>
#define ARRAY_SIZE(arr) (sizeof((arr))/sizeof((arr[0])))
/*
信号说明:
https://blog.csdn.net/wesleyluo/article/details/5279482
*/
//根据需要增删捕获的信号
static int s_arSignal[] = {SIGINT, SIGTSTP, SIGTERM, SIGPIPE, SIGALRM, SIGUSR1, SIGUSR2};
void signal_handle(int signo)
{
LOG_PRINTF(LOG_LEVEL_ERROR, LOG_MODULE_SYS, "Handle signo:%d", signo);
}
int signal_capture(void)
{
int i = 0;
struct sigaction act;
act.sa_handler = signal_handle;//将信号处理动作设置为信号捕捉
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
for(i = 0; i < ARRAY_SIZE(s_arSignal); ++i)
{
sigaction(s_arSignal[i], &act, NULL);
}
return 0;
}