關於fork的一道經典面試題

這是一道面試題,問程序最終輸出幾個「-」:面試

 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<unistd.h>
 4 int main()
 5 { 
 6     int i;
 7     for(i = 0; i < 2; i++)
 8     {
 9         fork();
10         printf("-");
11     }
12     wait(NULL);
13     
14     return 0;
15 } 

正確答案是8個,關鍵在於prinf("-")只是將字符放到了進程的緩衝區而不輸出,而fork在產生子進程的時候,會把父進程的緩衝區也拷貝一遍。以下圖所示:spa

如圖,一條箭頭表示一個進程,箭頭邊的0 "-"表示此時該進程的輸出緩衝區中沒有「-」,1 「-」表示有1個。通過fork後,緩衝區被拷貝,而通過一次prinf,則緩衝區中的「-」增長一個,最終當進程結束的時候,將緩衝區的內容輸出。3d

若是將printf("-")換成printf("-\n"),或者在printf("-")後加一句fflush(stdout),則每次printf的時候就將「-」輸出,緩衝區裏面再也不有東西,這樣執行多少次prinf就輸出多少次「-」,結果是6次。code

 

若是將fork()與prinf("-")交換位置,變成blog

 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<unistd.h>
 4 int main()
 5  { 
 6     int i;
 7     for(i = 0; i < 2; i++)
 8      {
 9          printf("-");
10          fork();
11      }
12      wait(NULL);
13      
14     return 0;
15  } 

則流程圖以下:進程

結果仍然是8次,最後的fork也是有起做用的,由於只有在進程結束後纔會輸出緩衝區的內容。it

相關文章
相關標籤/搜索