fork後printf如何輸出
阿新 • • 發佈:2019-01-27
#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的,也繼承一個“-”,再列印一個,此時也多一個,共多兩個。