实例 回忆一下8 . 5节中有关僵死进程的讨论。如果一个进程要f o r k一个子进程,但不要求它等待 子进程终止,也不希望子进程处于僵死状态直到父进程终止,实现这一要求的诀窍是调用f o r k 两次。程序8 - 5实现了这一点。 在第二个子进程中调用s l e e p以保证在打印父进程I D时第一个子进程已终止。在f o r k之后, 父、子进程都可继续执行——我们无法预知哪一个会先执行。如果不使第二个子进程睡眠,则 在f o r k之后,它可能比其父进程先执行,于是它打印的父进程I D将是创建它的父进程,而不是 i n i t进程(进程ID 1)。
#include #include #include "ourhdr.h"
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 */
/* We're the second child; our parent becomes init as soon as our real parent calls exit() in the statement above. Here's where we'd continue executing, knowing that when we're done, init will reap our status. */