+ -
当前位置:首页 → 问答吧 → php创建进程的疑惑(pcntl_fork),求解答

php创建进程的疑惑(pcntl_fork),求解答

时间:2011-10-19

来源:互联网

<?php
for ($x = 1; $x < 5; $x++) {
  switch ($pid = pcntl_fork()) {
  case -1:
  // @fail
  die('创建建成失败');
  break;

  case 0:
  print "CHILD,Done! :^)\n\n";
  break;

  default:
  print "FATHER,Done! :^)\n\n";
  break;
  }
  echo "I DO\n\n";
}
print " ALL Done! :^)\n\n";
?>
问题很简单,为什么输出16次:ALL Done! :^,输出15次:CHILD,Done! :^,输出15次:FATHER,Done! :^,和30次I DO

最让人疑惑的是I DO 输出30次,却只输出16次ALL Done! :^
求解惑!

作者: qk1987925   发布时间: 2011-10-19

帮顶呀!

作者: qk1987925   发布时间: 2011-10-19

跟switch的执行原理有关吧?
改成这样测试下看是什么结果
PHP code
<?php
for ($x = 1; $x < 5; $x++) {
  $pid = pcntl_fork();
  switch ($pid) {
    case -1:
    die('创建建成失败');
    break;

    case 0:
    print "CHILD,Done! :^)\n\n";
    break;

    default:
    print "FATHER,Done! :^)\n\n";
    break;
  }
  echo "I DO\n\n";
}
print " ALL Done! :^)\n\n";
?>

作者: ohmygirl   发布时间: 2011-10-19

ALL Done! :^

怎么会输出15次。


30次I DO也不可能。

楼主数绵羊数错了。

作者: ci1699   发布时间: 2011-10-19

eno@eno-desktop:/Data/localhost$ php 1.php| grep ALL | wc -l
16

引用 3 楼 ci1699 的回复:

ALL Done! :^

怎么会输出15次。


30次I DO也不可能。

楼主数绵羊数错了。

作者: qk1987925   发布时间: 2011-10-19

因为你没有kill掉子进程,造成子进程又fork了子进程。
PHP code

<?php
for ($x = 1; $x < 5; $x++) {
  $pid = pcntl_fork();
  switch ($pid) {
    case -1: 
        die('创建建成失败');
    break;

    case 0:
        print "CHILD,Done! :^)\n";
        posix_kill(posix_getpid(),SIGTERM);//<---
    break;

    default:
        print "FATHER,Done! :^)\n";
    break;
  }
  echo "I DO\n\n";
}
print " ALL Done! :^)\n";

?>


作者: foolbirdflyfirst   发布时间: 2011-10-19