信号设置
在设置各种配置参数之前,如果支持sigaction,则使用sigaction来设置SIGSEGV信号,指定处理函数调用g_on_error_stack_trace获取相关的堆栈信息后,调用abort退出程序。此信号在程序结束前进行清除,修复默认处理方式。
#ifdef HAVE_SIGACTION
/* register the sigsegv interceptor */
memset(&sigsegv_sa, 0, sizeof(sigsegv_sa));
sigsegv_sa.sa_handler = sigsegv_handler;
sigemptyset(&sigsegv_sa.sa_mask);
if (frontend->invoke_dbg_on_crash && !(RUNNING_ON_VALGRIND)) {
sigaction(SIGSEGV, &sigsegv_sa, NULL);
}
#endif
static void sigsegv_handler(int G_GNUC_UNUSED signum) {
g_on_error_stack_trace(g_get_prgname());
abort(); /* trigger a SIGABRT instead of just exiting */
}
同时,将SIGPIPE信号的处理方式设置为忽略。这里增加一些对SIGPIPE信号的介绍:TCP是全双工的信道,可以看作两条单工信道,,TCP连接两端的两个端点各负责一条。当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协