#include #include #include #include #include void err_sys(char * msg) { printf("%s \n", msg); exit(-1); } int main(void) { pid_t pid; if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid == 0) { /* first child */ if ( (pid = fork()) < 0) err_sys("fork error"); else if (pid > 0) exit(0); /* parent from second fork == first child */ /* This is the second child; its parent becomes init as soon as our real parent -the first child- calls exit() in the statement above. Here's where we'd continue executing, knowing that when we're done, init will read our status. */ sleep(2); printf("second child, parent pid = %d\n", getppid()); exit(0); } if (waitpid(pid, NULL, 0) != pid) /* wait for first child */ err_sys("waitpid error"); /* This is the parent (the original process); it continues executing, knowing that it's not the parent of the second child. */ system("ps"); exit(0); }