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 );
}
按理说这时子进程已经成为了僵尸进程了; 难道需要在子程序末加个exit?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
要先弄明白啥是僵尸进程。
僵尸进程的产生是因为子进程执行完了,父进程没有对其进行包括PID在内的资源回收操作。资源回收是由
pcntl_wait
函数来实现的,所以在执行sleep(2)
的时候,子进程确实已经是僵尸进程了。你把这个睡眠时间调大一点,去看ps
结果,应该能看到Z
标志位(zombie process)。而执行完pcntl_wait
之后,进程资源被回收了,也就不存在僵尸进程。而且你这段程序要运行在cli模式下,不要在fpm下玩。
疑惑了半天, 了解的可以说一下吗?
你的代码表达的意思是,子进程输出子进程的pid, 父进程输出父进程的pid。
因此,文件里面是两行。这个没毛病。