避免僵死进程实例

一个进程已经终止但其父进程尚未对其进行回收(获得终止子进程的有关信息,释放它占用的资源)的进程被称为僵死进程。

避免僵死进程的出现的一种办法是父进程调用wait、waitpid等待子进程结束,但这样做有一个弊端就是在子进程结束前父进程会一直阻塞,不能做任何事情。另外一种更好的方法就是调用两次fork函数。

源代码如下:

#include<stdio.h>

#include<unistd.h>

#include<sys/wait.h>

 

int main(){

        pid_t pid;

 

        if((pid = fork()) < 0){   //创建子进程

                perror("fork");

        }else if(pid == 0){       //子进程1

                if((pid = fork()) < 0){     //由子进程1创建子进程2

                       perror("fork");

                }

                else if(pid > 0){

                       exit(0);       //子进程1结束

                }

                else{         //子进程2

                        sleep(2);

                        printf("second child,parent pid = %d/n",getppid());  //打印子进程2的父进程

                        exit(0);

                }

         }

         else{        //父进程

                /* do something else*/

         }

}

 

因为子进程1创建完子进程2后退出,所以子进程2变成孤儿进程,自动被init进程收养。当子进程2结束时,init进程对子进程2进行了回收,避免了僵死进程的出现。其运行结果如下所示:

#./zomble

#second child,parent pid =1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值