// forkadd.c #include #include #define N 1000000 int main() { int i, j; double *bigarray = malloc(N * sizeof(bigarray[0])); for (i = 0; i < N; i++) scanf("%lf", bigarray+i); double sum = 0.0; int children_done = 0; // distribute work across 10 child processes for (j = 0; j < 10; j++) { if (fork() == 0) { // child 'j' sums up interval [N*j/10, N*(j+1)/10] double childsum = 0.0; // use separate variable for each child for (i = 0; i < N/10; i++) childsum += bigarray[j * N/10 + i]; sum += childsum; // add to total when done children_done += 1; } } // reap children before examining the result for (j = 0; j < 10; j++) wait(NULL); // double check that all children are done, output the result if (children_done == 10) printf("%lf\n", sum); return 0; }