#include #include /* atoi */ #include /* getpid */ #include #include #include #include void do_wait(int signal); int main(int argc, char *argv[]) { int pid; if ( SIG_ERR == sigset(SIGCHLD, do_wait)) perror("signal"); switch( pid = fork()) { case -1: perror("fork"); break; case 0: sleep(5); fprintf(stderr,"MSG: \"%d\"\n",getpid()); fflush(stderr); sleep(5); exit(0); break; default: fprintf(stderr, "spawned %d\n", pid ); fflush(stderr); break; } sigpause(SIGCLD); sighold(SIGCLD); exit(errno); } /************************************************************************/ void do_wait(int sig) { int st; int wpid; wpid = wait ( &st ); fprintf(stderr, "wait: died %d\n", wpid); if (WIFSTOPPED(st)) { fprintf(stderr,"stoped %d\n", WSTOPSIG(st)); } else if(WIFEXITED(st)) { fprintf(stderr, "do_wait: %d exit with %d\n", wpid, WEXITSTATUS(st)); } else if(WIFSIGNALED(st)) { fprintf(stderr,"signaled %d\n", WTERMSIG(st)); } if(st&0200) fprintf(stderr, "core dumped\n"); fprintf(stderr, "do_wait: died %d\n", wpid); fflush(stderr); sigset(SIGCHLD, do_wait); }