PHP多进程中如何防止僵死进程

根据《UNIX环境高级编程》中的定义,僵死进程指的是:一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为僵死进程(zombie)。

一旦某个进程fork了很多子进程,那么除非父进程等待取得子进程的终止状态,否则这些子进程终止后就会变成僵死进程。

现在可以利用在fork子程序时进行两次fork,把第一次fork的子程序退出,由于父程序对第一个子程序进行了wait,第一个子程序退出后就会发送一个WNOHANG的信号,父进程退出,然后第二个子进程就变成了init进程的子进程了,init进程会对所有的子进程进行管理!

下面的代码演示了上面所述的过程:

         $start=time();
    	$pid=pcntl_fork();
    	if($pid<0){
    		die("fork error!");
    	}elseif ($pid==0){//第一个子进程
    		$pidsecond=pcntl_fork();
    		if($pidsecond<0)
    		{
    		    die('fork error!');
    		}
    		else if($pidsecond>0)//第二个子进程的父进程,第一个子进程
    		{    
//    		    print ("first child,parent pid=".posix_getppid()."\n");
                sleep(1);
    			exit();	
    		}
    	    //下面是第二个子进程运行部分
    	    else if ($pidsecond==0) {
		    	sleep(2);
		    	print("second child,parent pid=".posix_getppid()."\n");
		    	exit();
    	    }

    	}
    	if(pcntl_waitpid($pid,$status)!=$pid)//wait 第一个子进程,父进程阻塞
    	{   
    		die('pcntl_wait error');
    	}
    	$end=time();
    	$used=$end-$start;
    	echo "used seconds:".$used."\n";
    	echo "parent pid:".posix_getpid()."\n";
    	exit();

执行上面的代码会看出有两个进程输出,父进程打印执行时间,第二个子进程打印父进程(父进程是init进程)的进程号码(结果是1)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值