最近比较多朋友问我常见的信号和一些信号实际的应用。所以,我简单总结一下,让大家对信号有清晰的理解。
我自己写的系统里面,我是直接参考redis的信号处理机制的。
redis是这样处理信号的:
如果系统支持 HAVE_BACKTRACK,即是:
#if defined(__APPLE__) || defined(__linux__) || defined(__sun)
#define HAVE_BACKTRACE 1
#endif
那么redis会用sigsegvHandler函数处理SIGSEGV , SIGBUS , SIGFPE , SIGILL等信号。
否则只用sigtermHandler 处理 SIGTERM ,SIGQUIT 。
我自己系统是这样实现的(分析如上):
void
setupSignalHandlers(void){
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = sigtermHandler;
sigaction(SIGTERM , &act , NULL);
sigaction(SIGQUIT , &act , NULL);
#ifdef HAVE_BACKTRACE
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NODEFER|SA_RESETHAND|SA_SIGINFO;
ac