根据《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)。