int main(void) { pid_t pid1, pid2, pid3, child; int val1 = 100, val2 = 200; int status; switch (pid1 = fork()) { /* child one */ case -1 : err_sys("Child1: fork"); case 0 : val1 = val1 + 1; printf("Child1 (%d): val1 = %d\n", getpid(), val1); status = status / 0; exit(0); } switch (pid2 = vfork()) { /* child two */ case -1 : err_sys("vfork"); case 0 : val2 = val2 + 1; printf("Child2 (%d): val2 = %d\n", getpid(), val2); execl("/bin/ps", "ps", "-gux", (char *) 0); err_sys("Child2: exec"); } while ((child = waitpid(pid2, &status, WNOHANG)) == 0) sleep(1); if (child == -1) err_sys("Parent: waitpid"); else exit_report(child, status); if ((child = wait(&status)) == -1) err_sys("Parent: waitpid"); else exit_report(child, status); printf("Parent: val1 = %d val2 = %d\n", val1, val2); switch (pid3 = vfork()) { /* child three */ case -1 : err_sys("Child3: fork"); case 0 : printf("Child3 (%d): what have I done?!\n", getpid()); exit(20); } printf("Parent: I'm done\n"); exit(0); } [1090] csb:Ex_vfork % vfork.bin Child1 (19351): val1 = 101 Child2 (19352): val2 = 201 USER PID %CPU %MEM SZ RSS TT STAT START TIME COMMAND park 19352 7.7 0.6 256 568 q6 R 16:32 0:00 ps -gux park 19350 7.7 0.3 40 272 q6 S 16:32 0:00 vfork.bin park 14528 0.0 0.5 384 504 q6 S May 23 0:54 -tcsh (tcsh) park 19351 0.0 0.0 0 0 q6 Z Apr 8 0:00normal termination: process 19352 status 0 abnormal termination: process 19351 signal 8 Parent: val1 = 100 val2 = 201 Child3 (19354): what have I done?! [1091] csb:Ex_vfork %