<?php
for ($x = 1; $x < 5; $x++) {
switch ($pid = pcntl_fork()) {
case -1:
// @fail
die('创建建成失败');
break; case 0:
print "CHILD,Done! :^)\n\n";
break; default:
print "FATHER,Done! :^)\n\n";
break;
}
echo "I DO\n\n";
}
print " ALL Done! :^)\n\n";
?>
问题很简单,为什么输出16次:ALL Done! :^,输出15次:CHILD,Done! :^,输出15次:FATHER,Done! :^,和30次I DO最让人疑惑的是I DO 输出30次,却只输出16次ALL Done! :^
求解惑!
for ($x = 1; $x < 5; $x++) {
switch ($pid = pcntl_fork()) {
case -1:
// @fail
die('创建建成失败');
break; case 0:
print "CHILD,Done! :^)\n\n";
break; default:
print "FATHER,Done! :^)\n\n";
break;
}
echo "I DO\n\n";
}
print " ALL Done! :^)\n\n";
?>
问题很简单,为什么输出16次:ALL Done! :^,输出15次:CHILD,Done! :^,输出15次:FATHER,Done! :^,和30次I DO最让人疑惑的是I DO 输出30次,却只输出16次ALL Done! :^
求解惑!
改成这样测试下看是什么结果
<?php
for ($x = 1; $x < 5; $x++) {
$pid = pcntl_fork();
switch ($pid) {
case -1:
die('创建建成失败');
break; case 0:
print "CHILD,Done! :^)\n\n";
break; default:
print "FATHER,Done! :^)\n\n";
break;
}
echo "I DO\n\n";
}
print " ALL Done! :^)\n\n";
?>
30次I DO也不可能。楼主数绵羊数错了。
16
for ($x = 1; $x < 5; $x++) {
$pid = pcntl_fork();
switch ($pid) {
case -1:
die('创建建成失败');
break; case 0:
print "CHILD,Done! :^)\n";
posix_kill(posix_getpid(),SIGTERM);//<---
break; default:
print "FATHER,Done! :^)\n";
break;
}
echo "I DO\n\n";
}
print " ALL Done! :^)\n";?>
<?php
for ($x = 1; $x < 5; $x++) {
switch ($pid = pcntl_fork()) {
case -1:
die('create error');
break;
case 0:
break;
default:
break;
}
}
printf("%d %d\n", posix_getpid(), posix_getppid());
#为了不让父进程退出, 导致子进程被init接管, 影响输出, 这里等待所有自己子进程结束自己再退出
while ( pcntl_wait($status) > 0 );把上面这段代码保存为t.php, shell中执行php t.php | sort -k 2你就可以看到, 你的子进程没有终止, 导致不断复制