php多进程时, 子进程退出了, 为什么pid还在?

一段简答的代码:

$pid = pcntl_fork(); 
if($pid == -1){
    exit("fork fail");
}elseif($pid){  // 主
    sleep(2); 
    $res = pcntl_wait($status, WNOHANG);
    file_put_contents( 'a.txt', '主'.getmypid()."\n",FILE_APPEND ); 

}else{      //子  
    file_put_contents( 'a.txt', '子'.getmypid()."\n",FILE_APPEND );   
}

image.png

按理说这时子进程已经成为了僵尸进程了; 难道需要在子程序末加个exit?

阅读 4.1k
3 个回答

要先弄明白啥是僵尸进程。
僵尸进程的产生是因为子进程执行完了,父进程没有对其进行包括PID在内的资源回收操作。资源回收是由pcntl_wait函数来实现的,所以在执行sleep(2)的时候,子进程确实已经是僵尸进程了。你把这个睡眠时间调大一点,去看ps结果,应该能看到Z标志位(zombie process)。而执行完pcntl_wait之后,进程资源被回收了,也就不存在僵尸进程。
而且你这段程序要运行在cli模式下,不要在fpm下玩。

疑惑了半天, 了解的可以说一下吗?

你的代码表达的意思是,子进程输出子进程的pid, 父进程输出父进程的pid。
因此,文件里面是两行。这个没毛病。

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