这是一个简化的程序。
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 :(得分:0)
在父进程中,您需要不时致电pcntl_wait()
或pcntl_waitpid()
。这些函数等待子进程退出然后返回其ID和状态。孩子使用的资源就是这种方式由操作系统发布,孩子不会变成僵尸。
退出的孩子的状态可以与pcntl_wexitstatus()
以及pcntl
扩展名中的其他功能一起使用,以了解孩子如何结束执行(正常终止并退回退出代码,终止用^ C,收到一个它没有处理的信号aso)