------ 文章開始 ------

 作者  JiDung (激動)                                       看板  Grad-ProbAsk 
 標題  Re: [理工] [OS] 迴圈中的fork                                           
 時間  Fri Jan  6 20:29:03 2012                                               
───────────────────────────────────────

※ 引述《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


------ 文章結尾 ------

[複製網址] [開新視窗] [加到我的最愛] [檢舉短網址] [QR條碼]



服務條款 - 完全手冊 - 加入會員(免費) - 聯絡偶們 -

© PPT.cc