linux for循環 fork() 產生子進程

 示例:編程

 1 #include <sys/types.h>
 2 
 3 #include <unistd.h>
 4 
 5 #include<stdio.h>
 6 
 7 int main()
 8 {
 9    for(int i = 0; i < 3; i ++)
10    {
11          int pid = fork();
12          if(pid == 0)
13          {
14                    printf("child\n");
15          }
16          else
17          {
18                     printf("father\n");
19          }
20      }
21    return 0;
22 }

 

請問輸出結果是什麼?測試

初看,想固然認爲結果是3對child-father,只是順序不肯定,並且按照Unix環境高級編程中的說法,極端的狀況下可能還會出現兩個輸出的內容相互夾雜的狀況。spa

可是,在Unix測試了一下發現輸出居然有7對child-father。code

1.i=0時,父進程進入for循環,此時因爲fork的做用,產生父子兩個進程(分別記爲F0/S0),分別輸出father和child,而後,兩者分別執行後續的代碼,那後續的代碼是什麼呢?return 0?固然不是,因爲for循環的存在,後續的代碼是add指令和一條jump指令,所以,父子進程都將進入i=1的狀況;blog

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。其對應的數學公式爲:io

 

1 + 2 + 4 + ... + 2^(n - 1) = 2^n - 1

 

不過話說回來,這種在for循環中使用fork的做法實在不值得推薦,研究研究尚可,實際應用恐怕會引來不少麻煩,需當心謹慎纔是。for循環

相關文章
相關標籤/搜索