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 操作

  1. 遇到 \n (換行符號)
  2. buffer 滿了
  3. 當被要求進行 I/O 操作 (fflush)

e.g. 當程式要讀取輸入(如 scanf)時,系統會自動 flush 所有 line buffered 的輸出(如 stdout),確保提示訊息能先顯示出來

Unbuffered

就是沒有 buffer,每次輸入東西就直接叫 write

e.g., stderr

Convention

  • stdinstdout 連接到 terminal (interactive device) 時是 line buffered
  • stderr 是 unbuffered

這並不是實際規定在 ANSI C 標準中,而是 convention