static RETSIGTYPE sighandler(int sig) { wait_reap(&reap_child, &sighandler); #if RETSIGTYPE != void return (0); #endif }
static RETSIGTYPE reap_children(int signum) { wait_reap(reap_child, reap_children); #if RETSIGTYPE != void return (0); #endif }
static void handle_signals (void) { for (;;) switch (selfpipe_read()) { case -1 : strerr_diefu1sys(111, "selfpipe_read") ; case 0 : return ; case SIGCHLD : wait_reap() ; break ; default : strerr_dief1x(101, "unexpected data in selfpipe") ; } }
static void handle_signals (void) { for (;;) { switch (selfpipe_read()) { case -1 : cleanup() ; strerr_diefu1sys(111, "selfpipe_read") ; case 0 : return ; case SIGTERM : case SIGQUIT : case SIGHUP : case SIGABRT : case SIGINT : cleanup() ; _exit(0) ; case SIGCHLD : wait_reap() ; break ; default : cleanup() ; X() ; } } }
static void handle_signals (void) { for (;;) { char c = selfpipe_read() ; switch (c) { case -1 : strerr_diefu1sys(111, "selfpipe_read") ; case 0 : return ; case SIGCHLD : if (!status.pid) wait_reap() ; else { int wstat ; int r = wait_pid_nohang(status.pid, &wstat) ; if (r < 0) if (errno != ECHILD) strerr_diefu1sys(111, "wait_pid_nohang") ; else break ; else if (!r) break ; status.pid = wstat ; /* don't overwrite status.wstat if it's ./finish */ (*actions[state][V_CHLD])() ; } break ; case SIGTERM : (*actions[state][V_TERM])() ; break ; case SIGHUP : (*actions[state][V_HUP])() ; break ; case SIGQUIT : (*actions[state][V_QUIT])() ; break ; default : strerr_dief1x(101, "internal error: inconsistent signal state. Please submit a bug-report.") ; } } }