<?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! :^
求解惑! 

解决方案 »

  1.   

    跟switch的执行原理有关吧?
    改成这样测试下看是什么结果
    <?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";
    ?>
      

  2.   

    ALL Done! :^怎么会输出15次。
    30次I DO也不可能。楼主数绵羊数错了。
      

  3.   

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

  4.   

    因为你没有kill掉子进程,造成子进程又fork了子进程。<?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";?>
      

  5.   


    <?php
    for ($x = 1; $x < 5; $x++) {
    switch ($pid = pcntl_fork()) {
    case -1:
    die('create error');
    break;
    case 0:
    break;
    default:
    break;
    }
    }
    printf("%d %d\n", posix_getpid(), posix_getppid());
    #为了不让父进程退出, 导致子进程被init接管, 影响输出, 这里等待所有自己子进程结束自己再退出
    while ( pcntl_wait($status) > 0 );把上面这段代码保存为t.php, shell中执行php t.php | sort -k 2你就可以看到, 你的子进程没有终止, 导致不断复制
      

  6.   

    另, 正常来说, 子进程中是应该显式的退出, 使用exit, die, 或给自己信号等方式.