這是一道面試題,問程序最終輸出幾個「-」:面試
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