看板 Grad-ProbAsk 關於我們 聯絡資訊
※ 引述《yyc1217 (somo)》之銘言: : 要計算create出幾個process : for(i=0;i<3;i++) : { : if(fork()==0) /*A*/ : { : fork(); /*B*/ : fork(); /*C*/ : fork(); /*D*/ : } : } : 答案是729 : 書上是寫9+9*8+(9+9*8)*8 : 請問有人可以解釋這式子是怎麼來的嗎= = : 因為我一直覺得有ABCD四個fork,至少一開始應該會是四的倍數 : 如果只看9的話,應該就是迴圈中的BCD 3次,但A不是也算一次嗎? : 謝謝! 你先看這題 int main() { fork(); fork(); fork(); } 包含main本身 結束後共有8個 如果不包含main本身 也就是多產生出來的process數 是7 再來看你原本的題目 在main第一次進入 (i=0時候) if(fork()==0) 時候的瞬間 此時就算呼叫fork一次了 此時會有原本的main 跟 main產生的兒子1號 因為main的fork回傳值會是>0 所以不會進入三fork(); 但是兒子fork是0 會進入 所以 兒子1號就進入了 三fork(); 如前述所講 兒子1號 經過三fork會產生出7個兒子 就當作是 兒子2號~~~兒子8號吧 此時 i++; main本身 跟 兒子1號~兒子8號 共九個人 都當i=1世代的 新爸爸 回憶一下 一開始i=0的時候 "一個"原始的main 一輪結束後 最後多了八個人 同理 這次i=1每位新爸爸 一輪結束後 都可以多出八個人 所以 就又多出了 9x8 ↑九個當父親 依此類推 又 i=2 多出了 [9+(9x8)]x8 ^^^^^^^^^ ↑ 框框內的數字 都當父親 所以答案是 9 + 9x8 + [9+(9x8)]x8 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.5.216
JiDung:喔.. 原來有人解了... 01/06 20:29
※ 編輯: JiDung 來自: 140.113.5.216 (01/06 20:58)
yyc1217:您好,在第一部分我想應該是3 fork共產生6個,含main為7 01/06 21:38
yyc1217:不知道這樣理解是否有誤? 謝謝! 01/06 21:38
yyc1217:啊啊不好意思 是共產生7個,然後含main為8個沒錯= = 01/06 21:43
yyc1217:謝謝您! 01/06 21:43
cisco:您好~ 我是卡在一開始為什麼會產生8個process >< 01/07 16:37
回樓上 當一開始的main 執行完第一個fork();之後 此時 會多出 兒子一號 而你要注意的是 兒子一號 會從產生出這位兒子的fork之後(第一個fork之後) "接著"往下做 原始main父親 也是同一個地方"接著"往下做 也就是說 int main() { //程式執行到這時候 只有原始main fork(); //只有原始main執行fork(); //程式執行到這 有原始main跟 兒子一號 //他們都是要從"這"繼續往下執行 fork(); //原始main跟兒子一號都有執行第二次的fork(); //到這裡原始main產生了兒子二號 而兒子一號產生了兒子三號 //所以到這的時候 已經有 原始main 兒子1號~兒子3號 共四個人 fork(); //上述所講的四個人 都有執行到 //所以又蹦出四個人(兒子4~7號) //所以到這裡總共有 原始main跟 兒子1~7號 共八個人 }
kiwidoit:1*2=2 2*2=4 4*=8 01/07 17:49
kiwidoit:fork() fork() fork() 01/07 17:49
※ 編輯: JiDung 來自: 140.113.235.115 (01/07 18:13)
bahamut5461:看完推 01/07 23:59
cisco:我懂了~ 感謝您!! 01/08 12:00
rockmanexe24:GET! Thank you very much! 02/03 11:28
fenir:看懂了,感謝! 11/22 15:24
sneak: 您好~ 我是卡在一開始 https://daxiv.com 09/11 14:44
zoo868e: 厲害 08/06 13:37