閱讀674 返回首頁    go 魔獸


LINUX 循環fork()

#include <sys/types.h>
  #include <unistd.h>
  int main()
  {
            for(int i = 0; i < 3; i ++)
      {
              int pid = fork();
              if(pid == 0)
              {
                   printf("child\n");
               }
               else
               {
                    printf("father\n");
                }
       }
   return 0;
  }
  請問輸出結果是什麼?
  初看,想當然認為結果是3對child-father,隻是順序不確定,而且按照Unix環境高級編程中的說法,極端的情況下可能還會出現兩個輸出的內容相互夾雜的情況。
  但是,在Unix測試了一下發現輸出竟然有7對child-father。為什麼會這樣呢?看了半天程序終於明白了這個簡單的問題。其實,這個問題在寫/懂匯編的人看來是再清楚不過了,問題就出在這個for循環。
  1.i=0時,父進程進入for循環,此時由於fork的作用,產生父子兩個進程(分別記為F0/S0),分別輸出father和child,然後,二者分別執行後續的代碼,那後續的代碼是什麼呢?return 0?當然不是,由於for循環的存在,後續的代碼是add指令和一條jump指令,因此,父子進程都將進入i=1的情況;
  2.i=1時,父進程繼續分成父子兩個進程(分別記為F1/S1),而i=0時fork出的子進程也將分成兩個進程(分別記為FS01/SS01),然後所有這些進程進入i=2;
  3.....過程於上麵類似,已經不用多說了,相信一切都已經明了了,依照上麵的標記方法,i=2時將產生F2/S2,FS12/SS12,FFS012/SFS012,FSS012/SSS012.
  因此,最終的結果是輸出7對child/father。其對應的數學公式為:
  1 + 2 + 4 + ... + 2^(n - 1) = 2^n - 1
  不過話說回來,這種在for循環中使用fork的作法實在不值得推薦,研究研究尚可,實際應用恐怕會引來很多麻煩,需小心謹慎才是。

最後更新:2017-04-03 12:55:57

  上一篇:go 分享一下我參加開發者大會以來自己的總結(僅供參考)
  下一篇:go PHP5.5在windows 安裝使用 memcached 服務端的方法以及 php_memcache.dll 下載