作者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/m.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