我正在 Linux 上用 C 撰寫一個程式,其中將stdout通過printf. 當然,我會盡量減少 IO 呼叫并緩沖所有資訊,然后將其傳遞給單個列印呼叫。但是,通過測驗,我發現printf它會自己緩沖,直到達到'\n'. 我的問題是,我可以確定所有printf實作都這樣做,還是 glibc 只是優化了?信任printf為我做緩沖是否可靠?
uj5u.com熱心網友回復:
C 標準允許無緩沖和緩沖的流。相關部分是C17 7.21.3/3:
當流是unbuffered 時,字符會盡快從源或目標出現。否則,字符可能會作為一個塊累積并傳輸到主機環境或從主機環境傳輸。當流被完全緩沖時,當緩沖區被填充時,字符將作為一個塊傳輸到主機環境或從主機環境傳輸。當流被行緩沖時,當遇到換行符時,字符將作為塊傳輸到主機環境或從主機環境傳輸。
這通常取決于作業系統而不是標準庫實作。大多數托管的基于控制臺的作業系統使用行緩沖實作,其中\n將“重繪 緩沖區”。否則,顯式呼叫fflush(stdout)將始終這樣做(嚴格來說它更易于移植)。
無緩沖系統的一個例子是有限的“裸機”微控制器,其中stdout是 UART,并且沒有硬體緩沖區來存盤大量字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338891.html
