static RETSIGTYPE usr1handler (int sig) { donep = 1; SIGRETURN(0); }
static RETSIGTYPE sigchld(int sig) { int status; waitpid(-1, &status, 0); SIGRETURN(0); }
static RETSIGTYPE usr2handler (int sig) { donep = 1; if (nchild == 0) exit (0); SIGRETURN(0); }
static RETSIGTYPE catchSIGHUP(int sig) { hangup = TRUE ; /* This should not be a problem on BSD systems */ signal(SIGHUP, catchSIGHUP); signal(SIGPIPE, catchSIGHUP); SIGRETURN(0); }
static RETSIGTYPE sigchld(int sig) { int status; /* * waitpid() is async safe. will return -1 or 0 on no more zombie * children */ while ((waitpid(-1, &status, WNOHANG)) > 0) ; SIGRETURN(0); }
static RETSIGTYPE childhandler (int sig) { pid_t pid; int status; do { pid = waitpid (-1, &status, WNOHANG|WUNTRACED); if (pid > 0 && (WIFEXITED(status) || WIFSIGNALED(status))) if (--nchild == 0 && donep) exit (0); } while(pid > 0); signal (SIGCHLD, childhandler); SIGRETURN(0); }
static RETSIGTYPE terminate(int sig) { if(getpid() == pgrp) { /* parent */ term_flag = 1; signal(sig, SIG_IGN); killpg(pgrp, sig); } else { /* child */ if(doing_useful_work) term_flag = 1; else exit(0); } SIGRETURN(0); }
int main(void) { SIGRETURN (*old)(); old = signal(SIGQUIT, SIG_DFL); return 0; }
static RETSIGTYPE sigtimeout(int sig) { sig_alarm = 1; SIGRETURN(0); }