fork函式與I O函式之間的互動關係

2021-08-01 22:48:10 字數 1028 閱讀 2543

uinx環境高階程式設計 第三版

#includeint globvar =6; 

char buf = "a write to stdout\n";

int main(void)

else

sleep(2);

printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);

exit(0);

}

./a.out

執行結果

a write to stdout

before fork

pid = 430, glob = 7, var = 89

pid = 429, glob = 6, var = 88

a.out > temp.out

執行結果

a write to stdout

before fork

pid = 432, glob = 7, var = 89

before fork

pid = 421, glob = 6, var = 88

為什麼指定到具體檔案中會多出before fork 而buf內容不多出呢?

1.write函式是不帶緩衝的。因為在fork之前呼叫write,所以資料寫到標準輸出一次。但是,標準i/o庫是帶緩衝的。如果標準輸出連線到終端裝置,則它是行緩衝的;否則他是全緩衝的。 當以互動方式執行該程式時,只得到該printf的一次輸出,其原因是標準輸出緩衝區由換行符沖洗。但是將標準輸出定向到乙個檔案的時候,輸出printf確實兩次,其原因是,在fork之前呼叫了一次printf,但當呼叫fork時候,該行資料還是在緩衝區,然後在將父程序資料空間複製到子程序的資料空間的時候,該緩衝區也被複製到子程序中,此時父程序和子程序都有帶改行的緩衝區,在exit之前的第二個printf將該行追加到已有的緩衝區中。在程序結束時,其緩衝區的內容都被寫到對應的檔案中。

fork 函式 fork 函式的使用

fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...

c 中的fork函式 FORK()函式

乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...

system,popen函式與fork的區別

說明 system函式在執行的過程中經過fork exec wait,但system在執行的過程中會一直等待,直到shell執行完才退出,所以system為序列執行 system在執行的過程中對sigchld sigint sigquit都做了處理 sigchld是子程序在退出的時候給父程序發的乙個...