#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> int processes; void handler(int sig) { pid_t t; int status; t=wait(&status); printf("Child %d exited with status %d\n",t,WEXITSTATUS(status)); processes -=1; } int main(int argc, char *argv[]) { pid_t pid; int i; if (argc!=2) { fprintf(stderr,"\nUsage\t%s <nchilds>\n",argv[0]); exit(1); } signal(SIGCHLD,handler); processes=atoi(argv[1]); for (i=0; i<processes; i++) { pid=fork(); if (pid<0) { perror("fork"); exit(1); } else if (!pid) { int t,s; s=getpid(); srand(s); t=(double)rand()/RAND_MAX*10+1; // Race!!! printf("Child %d: sleeping for %d sec.\n",s,t); sleep(t); exit(t); } } while (processes) { printf("sleeping\n"); sleep(1); } }