1. 程式人生 > >fork後printf如何輸出

fork後printf如何輸出

#include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>

int main(void) 
{ 
    int i; 
    for(i=0; i<2; i++){ 
        fork(); 
        printf("-"); 
    } 

    return 0; 
}

本人思路:

答:三個
  因為是先fork,再printf,所以第一次fork建立的子程序的緩衝區中沒有“-”,此時緩衝區中只有一個“-”,第二次進入建立再次進行fork,此時父程序的緩衝區中有一個“-”,fork之後,進行printf,第二個子程序中就有了一個”-“,此時父程序有兩個,第二個子程序有一個,共三個。程式結束時,程序全部退出,重新整理緩衝區,輸出三個”-“。

實際測試:
這裡寫圖片描述
原因:

錯誤分析:
  

* 不瞭解fork之後父子程序都會執行fork後面的程式碼,然後沒有考慮到printf緩衝區的情況 *

如圖:
這裡寫圖片描述
  第一次父程序進入之後fork子程序子1,同事要記得父子程序都會執行fork之後的程式碼,所以此時父子都會printf“-”,此時是兩個“-”
然後第二次fork,父程序再建立一個子程序子2,同時兩個都列印printf“-”,
  子1程序fork孫子程序孫1,此時子1和孫1都列印“-”,此時共6個“-”;
  這也是理論情況下的,但是由於printf有自己的緩衝區,所以會多列印兩個,即8個。,因為printf重新整理緩衝區時不帶’\n’時,是按全緩衝重新整理的,即遇到檔案結尾或緩衝區寫滿才會重新整理,所以在fork時緩衝區作為一個程序PCB中的一部分也被子程序繼承。
  

- 步驟:

  父建立子1,父和子1都列印“-“——2
  此時printf自己的緩衝區中有兩個
  父程序再次建立子2,此時父程序的printf緩衝空間中有一個“-”,fork時被子2繼承,所以子2的printf緩衝區中本來就有一個“-”,再加上自己列印的,共有兩個,同理,子1fork孫1時,孫1繼承子1的,也繼承一個“-”,再列印一個,此時也多一個,共多兩個。