作者p52189 (鼠霸)
看板PHP
标题[请益] pcntl_fork 的结果跟预期的不同
时间Thu Dec 1 16:37:00 2016
先上code:
for(
$i = 0;
$i < 3 ;
$i++){
$pid =
pcntl_fork();
if(
$pid == -1){
echo "error\n";
}elseif(
$pid == 0){
echo "child(".
getmypid().
")\n";
sleep(3);
exit();
}else{
pcntl_waitpid(
$pid,
$status);
}
}
我本来预期三个children应该几乎同时印出讯息
结果却是第一个印完等三秒第二个才印,依此类推
请问这是哪里误会了?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.115.120
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1480581423.A.B79.html
1F:→ p52189: 我是原PO,这个问题我朋友帮我解了,只要把 pcntl_waitpid 12/01 17:11
2F:→ p52189: 移出去就可以了 12/01 17:11
符合预期的版本,程式码如下:
$pidList = array();
for($i = 0; $i < 3 ; $i++){
$pid = pcntl_fork();
if($pid == -1){
echo "error\n";
}elseif($pid == 0){
echo "child(".getmypid().")\n";
sleep(3);
exit();
}else{
array_push($pidList, $pid);
}
}
if($pid != 0){
foreach($pidList as $pid){
pcntl_waitpid($pid, $status);
}
}
※ 编辑: p52189 (59.115.115.120), 12/01/2016 17:11:52
※ 编辑: p52189 (59.115.115.120), 12/01/2016 17:14:51
※ 编辑: p52189 (59.115.115.120), 12/01/2016 17:19:01
※ 编辑: p52189 (59.115.115.120), 12/01/2016 17:20:02
3F:推 Jerr: 有 fork 给推 12/01 17:32
4F:推 shadowjohn: 好thread.php不用吗 12/01 18:33
5F:→ p52189: 不能用,伺服器不能动不然我也QQ 12/01 19:21
6F:推 gpmm: 好巧,我今天也才正好在写 pcntl_fork XDD 12/01 22:15
8F:→ shadowjohn: 虽然是2009年的东西,但相当实用...也是pcntl :) 12/02 10:02
9F:→ shadowjohn: 轻易就可以改出几种常用的方法 12/02 10:03
10F:→ shadowjohn: 10份工作给三个人作,一定要三个人完成才领下一组 12/02 10:03
11F:→ shadowjohn: 或先作完的领下一组继续,直到所有工作完成一起结束 12/02 10:04