2011-10-30 95 views
1

我有一個關於標準庫中I/O緩衝的問題: 我讀了關於文件I/O緩衝的「Linux編程接口」第13章,作者提到標準庫使用磁盤文件和終端的I/O緩衝。 我的問題是,這種I/O緩衝也適用於FIFO,管道,套接字和網絡文件?C/C++標準庫中的緩衝

回答

1

是的,如果您使用基於FILE *的標準I/O庫。唯一可能發生的奇怪的事情是底層系統文件描述符對isatty函數返回非零值。然後,stdio可能會'行緩衝'輸入和輸出。這意味着它在看到'\n'時傾向於沖刷。

我相信,如果文件描述符1對於isatty返回非零值,則需要將行緩衝區stdout

0

號凡是是一個普通的文件描述符(如由open(2)pipe(2)socket(2)回來,accept(2))不會被緩衝,任何讀取或寫入它的輸入或輸出立即通過直接的系統調用數據。

緩衝只發生在您有FILE*對象時,您可以通過fopen(3)獲得常規磁盤文件;對象stdin,stdoutstderr也是FILE*在程序啓動時設置的對象。緩衝通常在FILE*對象上啓用,但並非總是如此 - 它可以使用setbuf(3)禁用,並且stderr默認情況下不緩存。

如果您想從常規文件描述符中創建緩衝流,可以使用fdopen(3)來實現。

+0

嗨,亞當,感謝您的答案,但我知道我們可以通過調用fdopen()創建一個具有現有fd的FILE對象。 如果我們通過調用該函數並調用fwrite()或fread()來創建一個FILE對象,標準I/O緩衝將應用於管道,套接字和FIFO嗎? – kai

+0

我不確定OP究竟在想什麼,但總是在* some *級別緩衝,否則在保證沒有數據丟失的情況下編寫同步接口到管道,套接字等是不可能的。 –

相關問題