php pcntl_fork 子进程exit退出问题

父进程使用while(1) 挂起进程,子进程中用到了exit(1) 但是最终ps -ef |grep php 发现子进程并没有退出,是什么原因造成这个问题的,正常来说子进程不是应该会退出吗?

<?php
for($i=0;$i<10;$i++){
    fork_worker();
}


function fork_worker(){
    $pid = pcntl_fork();
    if($pid == 0){ //child processes
        echo "子进程\r\n";
        $this_id = getmypid();
        echo  $this_id."\r\n";
        exit(1);
    }elseif($pid > 0){ //master processes
        echo "父进程\r\n";
    }
}
while(1);
?>

忘答疑解惑

阅读 7.6k
3 个回答

父进程没有调用 wait 的情况下,子进程会成为僵尸进程,不会被回收。

<?php
$id = [];
for($i=0;$i<10;$i++){
    $id[] = fork_worker();
}

function fork_worker(){
    $pid = pcntl_fork();
    if($pid == 0){ //child processes
        echo "子进程\r\n";
        $this_id = getmypid();
        echo  $this_id."\r\n";
        exit(1);
    }elseif($pid > 0){ //master processes
        echo "父进程\r\n";
        return $pid;
    }
}

foreach($id as $i) {
    pcntl_wait($i);
}
while(1);
?>

exit是执行进程退出。但子进程退出需要由尚在工作的父进程回收资源,譬如调用pcntl_wait,若不回收就会变成僵尸进程,仍会占用少量系统资源。如父进程退出,这时子进程会被内核init进程接管并回收掉。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题