两次fork防止僵尸进程

1、何谓僵尸进程?
         在linux系统中,一个已经终止但父进程尚未对其进行善后处理(释放子进程相关信息占用的资源)的子进程叫做僵尸进程 。子进程结束时,父进程调用pid_t wait(int *statloc)或者pid_t waitpid(pid_t pid,int *statloc,int options)获取内核中为子进程保存的信息(进程id,终止状态)。

2、僵尸进程避免分析

        创建进程时,子进程的终止状态要返回给父进程,但调用fork函数时候,若父进程比子进程提前结束,则由init进程领养:在一个进程终止时候,内核逐个 检查所有活动进程,判断它是否是被终止进程的子进程,如果是,则将该进程父进程的ID更改为1,这样,每个进程都有父进程,init 进程只要检测有子进程终止就会调用wait或waitpid释放资源,防止僵尸进程。

3、解决办法:调用两次fork避免僵尸进程

#include "apue.h"
#include <sys/wait.h>
int main(void)
{
    pid_t    pid;
    if ((pid = fork()) < 0)
    {
        err_sys("fork error");
    }
    else if (pid == 0)  // 第一个子进程
    {
        if ((pid = fork()) < 0)
            err_sys("fork error");
        else if (pid > 0)
            exit(0);    //第二个子进程的父进程终止(第一个子进程)
        
        //这里是第二个子进程(孤儿进程),其父进程已经变成了init进程,当亲生父进程在上面调用exit()终止后,在此处继续执行,当第二个子进程终止的时候,父进程init会获取其状态,从而避免僵尸进程嗯。
          
        sleep(2);    //保证父进程优先运行(第一个子进程)
        printf("second child, parent pid = %d/n", getppid()); //获取父进程ID(即init ID,为1)
        exit(0);    //第二个子进程终止
    }

    if (waitpid(pid, NULL, 0) != pid) //等待第一个子进程
        err_sys("waitpid error");

    printf("i am the parents of your parents/n");
    
       //这里是继续执行原始父进程(第一个父进程),且知道不是第二个子进程的父进程
     
    exit(0); //第一个父进程终止
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值