Board logo

标题: 孤儿进程和僵尸进程(2) [打印本页]

作者: yuyang911220    时间: 2017-1-25 19:19     标题: 孤儿进程和僵尸进程(2)

第二种方法:两次fork():转载
在《Unix 环境高级编程》里关于这个在8.6节有非常清楚的说明。
实例
回忆一下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        <sys/types.h>
#include        <sys/wait.h>
#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. */
                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");
        /* We're the parent (the original process); we continue executing,
           knowing that we're not the parent of the second child. */
        exit(0);
}
  //avoid zombie process by forking twice




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0