牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2011-11-18 投稿人: 浏览次数:169

根据《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()."
");
                sleep(1);
    			exit();	
    		}
    	    //下面是第二个子进程运行部分
    	    else if ($pidsecond==0) {
		    	sleep(2);
		    	print("second child,parent pid=".posix_getppid()."
");
		    	exit();
    	    }

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

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。