fork()函數陷阱

首先,fork()系統調用的特性:緩存

  •  fork()系統調用是Unix下以自身進程建立子進程的系統調用,一次調用,兩次返回,若是返回是0,則是子進程,若是返回值>0,則是父進程(返回值是子進程的pid),這是衆爲周知的。
  • 還有一個很重要的東西是,在fork()的調用處,整個父進程空間會原模原樣地複製到子進程中,包括指令,變量值,程序調用棧,環境變量,緩衝區,等等。
 
 
1 int main(){
2      int i;
3      for( i=0;i<2;i++){
4          fork();
5          printf("#");
6       }
7      return 0;
8 }

該結果輸出8個#而非6個,緣由是fork()函數的第二個特性,父進程printf()函數的緩存區被複制到子進程的空間,所以多了兩個#。函數

只要把printf("#")改爲printf("#\n") 或者加一句fflush(stdout) 結果就是6.spa

注意,該進程一共產生了3個子進程,共計四個進程。code

那麼,把for循環中的2改爲3 會輸出多少個#呢?blog

答案是24個! 一共有8個進程。進程

 

1 int main(){
2      int i;
3      printf("halo\n");
4      for( i=0;i<3;i++){
5          fork();
6          printf("#");
7       }
8     return 0;
9 }

那麼結果如何呢?   以下所示:for循環

1 halo
2 ########

再看一例:class

 1 static int i=0;
 2 
 3 int main(){
 4     i++;
 5     fork();
 6     fork();
 7     fork();
 8     sleep(1);
 9     printf("%d\n",i);
10 }

結果以下:變量

1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
相關文章
相關標籤/搜索