Buffering
Goal
我們想要盡量減少轉換成 kernel mode 的次數,也就是減少 read, write system call 的次數
Allocation
當我們呼叫 fopen 時,並不會第一時間分配 buffer,而是當我們第一次進行 I/O 操作時,也就是我們第一次實際需要用到 buffer 時才會分配
Types
Fully Buffered
只會在 buffer 滿了才會進行實際的 I/O 操作,像是我們每次 fprintf 時並不會實際呼叫 write 進行寫入操作,而是等到 buffer 滿了後再呼叫一次 write 將之前累計的資料一次寫入
e.g., disk files, pipes, sockets
Line Buffered
只有在三種情況下 Line Buffered 才會進行 I/O 操作
- 遇到
\n(換行符號) - buffer 滿了
- 當被要求進行 I/O 操作 (
fflush)
e.g. 當程式要讀取輸入(如 scanf)時,系統會自動 flush 所有 line buffered 的輸出(如 stdout),確保提示訊息能先顯示出來
Unbuffered
就是沒有 buffer,每次輸入東西就直接叫 write
e.g., stderr
Convention
stdin和stdout連接到 terminal (interactive device) 時是 line bufferedstderr是 unbuffered
這並不是實際規定在 ANSI C 標準中,而是 convention