Chinaunix首页 | 论坛 | 博客
  • 博客访问: 402149
  • 博文数量: 78
  • 博客积分: 3642
  • 博客等级: 中校
  • 技术积分: 695
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-23 15:33
文章分类

全部博文(78)

文章存档

2007年(53)

2006年(25)

分类: C/C++

2006-10-26 13:50:17

(APUE)Figure 8.8. Avoid zombie processes by calling fork twice

#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(void)
{
   pid_t pid;

    if ((pid = fork()) < 0)
    {
        fprintf(stderr,"Fork error!\n");
        exit(-1);
    }
    else if (pid == 0) /* first child */
    {
        if ((pid = fork()) < 0)
        {
            fprintf(stderr,"Fork error!\n");
            exit(-1);
        }
        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 */
    {
        fprintf(stderr,"Waitpid error!\n");
        exit(-1);
    }

    /*
     * We're the parent (the original process); we continue executing,
     * knowing that we're not the parent of the second child.
     */

    exit(0);
}

阅读(2601) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~