// The Great Fork! #include #include #include #include #include #include #define sz (1<<(22-3)) #define dc 4 #define pc 3 void pwho(int r, int v){printf("I am %d from %d at %d: %d\n", (int)getpid(), (int)getppid(), r, v);} int main(){int * big = malloc (sz<<3); int v=pc; pid_t who[pc]; pwho(1, -1); srandom(42); {int y=dc; while(y--) {int u = random()&(sz-1); big[u] = u;}} while(v--) {pid_t w = fork(); pwho(2, v); if(w<0) {printf("w = %d\n", (int)w); if(w==-1) {if(errno == EAGAIN) printf("EAGAIN!!\n"); else printf("errno=%d; EAGAIN=%d EDEADLK=%d\n", errno, EAGAIN, EDEADLK);}} assert(w>=0); if(w) who[v]=w; else goto child;} assert(v==-1); printf("%d launched\n", pc); {int y=pc; while(y--) {int stat; pid_t k = wait(&stat); {int z=pc; while(z--) if(k==who[z]) {who[z]=0; goto good;} exit(printf("Whozzat?\n")); good: if (WIFEXITED(stat)) printf("%d quit\n", WEXITSTATUS(stat)); else exit(printf("Bang\n"));}} exit(printf("All's well\n"));} child: srandom(42); // The children do this. pwho(3, v); printf("Hello\n"); {int y=dc; while(y--) {int u = random()&(sz-1); printf("x=%0d %p %d\n", u, big, *(big+u)); if(u-big[u]) exit(printf("foul"));}} printf("Good\n"); pwho(4, v); exit(v);}