理解 pcntl_fork 函数
- 第一种情况
for ($n = 1; $n <=3; $n++) { $pid = pcntl_fork(); if($pid==0){ }elseif ($pid>0){ } } sleep(10000);
根据这进程结构可以看出 当第一次fork后 子进程里面的代码和父进程代码一样,此时pid=12577的子进程里面相当于,注意 父进程12576 也是一样的,但是他们的执行顺序不确定,受cpu调度
当pid=12576 第二次循环是 产生子进程12578 ,而子进程12577 执行时候又产生子进程12581 因为最后的sleep函数导致每个进程都阻塞,所以出现这样的进程结构for ($n = 2; $n <=3; $n++) { $pid = pcntl_fork(); if($pid==0){ }elseif ($pid>0){ } } sleep(10000);
- 第二种情况
for ($n = 1; $n <=3; $n++) { $pid = pcntl_fork(); if($pid==0){ }elseif ($pid>0){ sleep(10000); } }
出现这种进程结构 是因为 父进程睡眠,最外层才执行一次,而子进程执行会继续fork出子进程,而它自己睡眠,这样一直下去就出现这种结构 - 第三种情况
for ($n = 1; $n <=3; $n++) { $pid = pcntl_fork(); if($pid==0){ sleep(10000); }elseif ($pid>0){ } }
这种结构 是因为子进程睡眠 导致子进程无法继续执行,所以父进程里三个循环创建的三个子进程睡眠,然后父进程退出
本作品采用《CC 协议》,转载必须注明作者和本文链接