Files

Unix 中行緩衝的兩個注意事項是什麼?

  • March 2, 2019

APUE第5.4章關於行緩衝區的一段:

  1. 行緩衝。在這種情況下,標準 I/O 庫會在輸入或輸出中遇到換行符時執行 I/O。這允許我們一次輸出一個字元(使用標準 I/O fputc 函式),知道只有在我們完成每一行的寫入後才會發生實際的 I/O。當流引用終端時,通常會在流上使用行緩衝——例如標準輸入和標準輸出。行緩衝有兩個注意事項。首先,標準 I/O 庫用於收集每一行的緩衝區大小是固定的,因此如果我們在寫入換行符之前填充此緩衝區,則可能會發生 I/O。其次,每當通過標準 I/O 庫從 (a) 無緩衝流或 (b) 行緩衝流(需要從核心請求數據)請求輸入時,所有行緩衝的輸出流都被刷新。(b) 上的限定符的原因是請求的數據可能已經在緩衝區中,這不需要從核心讀取數據。顯然,來自無緩衝流的任何輸入(項目 (a))都需要從核心獲取數據。

我真的不明白這兩個警告。有人可以舉個例子嗎?

  1. 基本上說,例如,如果您的程序正在向終端寫入文本,一次一個字元,非常緩慢,並且該行是(例如)520 個字元長,那麼庫可能會將前 512 個字元寫入終端在您的程序完成編寫(甚至生成)該行之前。
  2. 說如果您的程序正在向終端寫入文本,一次寫入一個字元(或其他一些小塊),然後從終端(即鍵盤)讀取,那麼庫將寫入終端的部分您的程序在此之前生成的輸出行。這通常是您想要的,因為寫入終端的部分行可能是輸入提示,但有時可能不是。

引用自:https://unix.stackexchange.com/questions/474126