void register_other_handlers() { #ifdef SIGALRM REGISTER_SIGNAL(SIGALRM, &alarm_handler, log_server_register_handler); #endif #ifdef SIGVTALRM REGISTER_SIGNAL(SIGVTALRM, &alarm_handler, log_server_register_handler); #endif #ifdef SIGPROF REGISTER_SIGNAL(SIGPROF, &alarm_handler, log_server_register_handler); #endif log_server_register_other_handlers(); }
static void common_exit_handler(int sSignal, bool tType) { signal(sSignal, SIG_DFL); if (getpid() != controlling_pid) raise(sSignal); if (!handling_error) { handling_error = true; if (tType) log_server_abnormal_error(getpid(), sSignal, strsignal(sSignal)); else log_server_terminate(getpid(), sSignal, strsignal(sSignal)); cleanup_routines(); #ifdef PARAM_NEW_SIG log_server_new_signal(getpid(), PARAM_NEW_SIG, strsignal(PARAM_NEW_SIG)); #endif log_server_controlled_exit(getpid()); } else log_server_uncontrolled_exit(getpid()); //NOTE: this disables logging; don't put it in 'cleanup_routines' cleanup_server(); #ifdef PARAM_NEW_SIG signal(PARAM_NEW_SIG, SIG_DFL); REGISTER_SIGNAL(PARAM_NEW_SIG, SIG_DFL, log_server_deregister_handler) killpg(0, SIGCONT); killpg(0, PARAM_NEW_SIG); #else signal(sSignal, SIG_DFL); REGISTER_SIGNAL(sSignal, SIG_DFL, log_server_deregister_handler) killpg(0, SIGCONT); killpg(0, sSignal); #endif }
void register_termination_handlers() { #ifdef SIGTERM REGISTER_SIGNAL(SIGTERM, &termination_handler, log_server_register_handler); #endif #ifdef SIGINT REGISTER_SIGNAL(SIGINT, &termination_handler, log_server_register_handler); #endif #ifdef SIGQUIT REGISTER_SIGNAL(SIGQUIT, &termination_handler, log_server_register_handler); #endif #ifdef SIGHUP REGISTER_SIGNAL(SIGHUP, &termination_handler, log_server_register_handler); #endif #ifdef SIGUSR1 REGISTER_SIGNAL(SIGUSR1, &ignore_handler, log_server_register_handler); #endif #ifdef SIGUSR2 REGISTER_SIGNAL(SIGUSR2, &ignore_handler, log_server_register_handler); #endif log_server_register_terminate_handlers(); }
//注册信号 int reg_sign() { REGISTER_SIGNAL(SIGTERM, sig_handle, true); //Kill信号 REGISTER_SIGNAL(SIGINT, sig_handle, true); //终端CTRL-C信号 REGISTER_SIGNAL(SIGUSR2, SIG_IGN, false); //忽略SIGUSR2信号 REGISTER_SIGNAL(SIGHUP, SIG_IGN, false); //忽略SIGHUP信号 REGISTER_SIGNAL(SIGUSR1, SIG_IGN, false); //忽略SIGUSR1信号 REGISTER_SIGNAL(SIGCHLD, SIG_IGN, false); //忽略子进程退出 //向一个已经关闭的SOCKET send数据,内核会向程序发送一个PIPE信号 REGISTER_SIGNAL(SIGPIPE, SIG_IGN, false); //忽略SIGPIPE信号 REGISTER_SIGNAL(SIGALRM, SIG_IGN, false); //忽略SIGPIPE信号 return 0; }
void restore_handlers() { #ifdef SIGFPE REGISTER_SIGNAL(SIGFPE, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGILL REGISTER_SIGNAL(SIGILL, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGSEGV REGISTER_SIGNAL(SIGSEGV, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGBUS REGISTER_SIGNAL(SIGBUS, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGABRT REGISTER_SIGNAL(SIGABRT, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGIOT REGISTER_SIGNAL(SIGIOT, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGIO REGISTER_SIGNAL(SIGIO, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGTRAP REGISTER_SIGNAL(SIGTRAP, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGEMT REGISTER_SIGNAL(SIGEMT, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGSTKFLT REGISTER_SIGNAL(SIGSTKFLT, SIG_DFL, log_server_register_handler); #endif #ifdef SIGSYS REGISTER_SIGNAL(SIGSYS, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGPIPE REGISTER_SIGNAL(SIGPIPE, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGLOST REGISTER_SIGNAL(SIGLOST, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGXCPU REGISTER_SIGNAL(SIGXCPU, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGXFSZ REGISTER_SIGNAL(SIGXFSZ, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGPIPE REGISTER_SIGNAL(SIGPIPE, SIG_DFL, log_server_register_handler); #endif #ifdef SIGTSTP REGISTER_SIGNAL(SIGTSTP, SIG_DFL, log_server_register_handler); #endif #ifdef SIGTTIN REGISTER_SIGNAL(SIGTTIN, SIG_DFL, log_server_register_handler); #endif #ifdef SIGTTOU REGISTER_SIGNAL(SIGTTOU, SIG_DFL, log_server_register_handler); #endif #ifdef SIGPOLL REGISTER_SIGNAL(SIGPOLL, SIG_DFL, log_server_register_handler); #endif #ifdef SIGPWR REGISTER_SIGNAL(SIGPWR, SIG_DFL, log_server_register_handler); #endif #ifdef SIGINFO REGISTER_SIGNAL(SIGINFO, SIG_DFL, log_server_register_handler); #endif #ifdef SIGUNUSED REGISTER_SIGNAL(SIGUNUSED, SIG_DFL, log_server_register_handler); #endif #ifdef SIGSYS REGISTER_SIGNAL(SIGSYS, SIG_DFL, log_server_register_handler); #endif #ifdef SIGTERM REGISTER_SIGNAL(SIGTERM, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGINT REGISTER_SIGNAL(SIGINT, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGQUIT REGISTER_SIGNAL(SIGQUIT, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGHUP REGISTER_SIGNAL(SIGHUP, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGUSR1 REGISTER_SIGNAL(SIGUSR1, SIG_DFL, log_server_register_handler); #endif #ifdef SIGUSR2 REGISTER_SIGNAL(SIGUSR2, SIG_DFL, log_server_register_handler); #endif #ifdef SIGALRM REGISTER_SIGNAL(SIGALRM, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGVTALRM REGISTER_SIGNAL(SIGVTALRM, SIG_DFL, log_server_deregister_handler) #endif #ifdef SIGPROF REGISTER_SIGNAL(SIGPROF, SIG_DFL, log_server_deregister_handler) #endif log_server_deregister_handlers(getpid()); }
void register_abnormal_handlers() { #ifdef SIGFPE REGISTER_SIGNAL(SIGFPE, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGILL REGISTER_SIGNAL(SIGILL, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGSEGV REGISTER_SIGNAL(SIGSEGV, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGBUS REGISTER_SIGNAL(SIGBUS, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGABRT REGISTER_SIGNAL(SIGABRT, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGIOT REGISTER_SIGNAL(SIGIOT, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGIO REGISTER_SIGNAL(SIGIO, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGTRAP REGISTER_SIGNAL(SIGTRAP, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGEMT REGISTER_SIGNAL(SIGEMT, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGSTKFLT REGISTER_SIGNAL(SIGSTKFLT, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGSYS REGISTER_SIGNAL(SIGSYS, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGPIPE REGISTER_SIGNAL(SIGPIPE, &ignore_handler, log_server_register_handler); #endif #ifdef SIGLOST REGISTER_SIGNAL(SIGLOST, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGXCPU REGISTER_SIGNAL(SIGXCPU, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGXFSZ REGISTER_SIGNAL(SIGXFSZ, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGTSTP REGISTER_SIGNAL(SIGTSTP, &ignore_handler, log_server_register_handler); #endif #ifdef SIGTTIN REGISTER_SIGNAL(SIGTTIN, &ignore_handler, log_server_register_handler); #endif #ifdef SIGTTOU //NOTE: this signal is required for terminal session handling; don't ignore! // REGISTER_SIGNAL(SIGTTOU, &ignore_handler, log_server_register_handler); #endif #ifdef SIGPIPE REGISTER_SIGNAL(SIGPIPE, &ignore_handler, log_server_register_handler); #endif #ifdef SIGPOLL REGISTER_SIGNAL(SIGPOLL, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGPWR REGISTER_SIGNAL(SIGPWR, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGINFO REGISTER_SIGNAL(SIGINFO, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGUNUSED REGISTER_SIGNAL(SIGUNUSED, &abnormal_exit_handler, log_server_register_handler); #endif #ifdef SIGSYS REGISTER_SIGNAL(SIGSYS, &abnormal_exit_handler, log_server_register_handler); #endif log_server_register_abnormal_handlers(); }