//===================================================== // Matt Kretchmar // A second attempt at reaping zombie children. // Problem: parent might miss future child signals while // processing current signal. //===================================================== #include /* symbolic constants */ #include /* system data types */ #include /* Errors */ #include /* Input/Output */ #include /* Wait for Process Termination */ #include /* General Utilities */ #include #include #include #include void errExit(char * s) { perror(s); exit(1); } void handler (int sig) { pid_t pid; int status; if ( sig == SIGCHLD ) { printf("Parent receiving signal from child\n"); pid = waitpid(-1,&status,0); printf("Parent waited for %d (status=%d)\n",pid,status); sleep(1); } } int main ( int argc, char *argv[] ) { pid_t pid; /* variable to hold process id */ int i; int n = 3; if (signal(SIGCHLD,handler) == SIG_ERR) errExit("signal handler registration error"); for (i = 0; i < n; i++ ) { pid = fork(); if ( pid == 0 ) { printf("%d child spawned\n",getpid()); sleep(1); exit(1); } } while(1); return 0; }