2014-12-05 46 views
0

这是一个简化的程序。PHP分叉进程不完全退出并成为僵尸

test.php是一个守护程序,总是在那里运行。 它叉进程来处理一些任务。 完成工作后,分叉进程退出。 但分叉进程退出时,它变成僵尸。

如何使分叉进程完全退出而不会变成僵尸?

#!/usr/bin/php 
<?php 

while (1) { 
    sleep(1); 

    $pid = pcntl_fork(); 
    if (!$pid) { 
    $mypid = getmypid(); 
    sleep(5); 
    print "pid=$mypid finish work \n"; 
    exit(); 
    } 

    sleep(1); 
} // while 

?> 

./test.php 
... daemon running ... 

$ ps -ef | grep mqp 
ubuntu 10084 10073 0 12:21 pts/0 00:00:00 /usr/bin/php ./test.php 
ubuntu 10085 10073 0 12:21 pts/0 00:00:00 /usr/bin/php ./test.php 
ubuntu 10074 10073 0 12:21 pts/0 00:00:00 [test.php] <defunct> 
ubuntu 10075 10073 0 12:21 pts/0 00:00:00 [test.php] <defunct> 
+0

僵尸成为这样的时候,父母不收集死儿童肉。 – DRC 2014-12-05 18:00:48

回答

0

在您需要调用pcntl_wait()pcntl_waitpid()不时父进程。这些函数等到孩子退出然后返回其ID和状态。孩子使用的资源是这种方式由操作系统发布的,孩子不会成为僵尸。

的退出子的状态可以与来自pcntl延伸pcntl_wexitstatus()等功能被用来找出子如何结束其执行(正常结束和一个出口返回代码,用^ C终止,接收到的信号它没有处理aso)