<?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);
按道理来说子进程已经exit了、但是查看进程的时候子进程还是存在的,按道理说最下面的while(1)只会在父进程执行。想了很长时间一直不理解,忘帮忙答疑
进程exit不意味着程序消失
https://www.cnblogs.com/wucha...
任何一个子进程(init除外)在exit后并非马上就消失,而是留下一个称外僵尸进程的数据结构,等待父进程处理。这是每个子进程都必需经历的阶段。另外子进程退出的时候会向其父进程发送一个SIGCHLD信号。
需要父进程处理 SIGCHLD 信号,不然就会成僵尸进程,可以在父进程增加信号监听
pcntl_signal(SIGCHLD, SIG_IGN);
SIG_IGN 表示忽略信号(虽然是忽略,但是意味着父进程处理了该信号,内核就会释放该进程资源)