一、總結
文件I/O一章講了不帶緩沖的I/O,本章講的是帶緩沖的I/O。不帶緩沖針對的是內核的系統調用,而帶緩沖針對的是用戶空間的標准庫函數,是基於帶緩沖的I/O實現的。不帶緩沖的I/O通過文件描述符的方式來引用一個文件,而帶緩沖的I/O則通過文件流(stream)的方式來引用文件。至於為什麼要用流的方式,原因就是帶緩沖區,這樣文件的讀寫就要經過緩沖區做緩沖,就像水流一樣。
引入標准IO庫的目的是為了提高IO的效率,避免頻繁的進行read/write系統調用,而系統調用會消耗較多的資源。因此標准IO庫引入了IO緩存,通過累積一定量的IO數據後,然後集中寫入到實際的文件中來減少系統調用,從而提高IO效率。標准IO庫會自動管理內部的緩存,不需要程序員介入。然而,也正是因為我們看不到標准IO庫的緩存,有時候會給我們帶來一定的迷惑性。
緩沖區的類型分為三種:
1)全緩沖:在填滿標准I/O緩沖區後才進行實際I/O操作,對於磁盤上的文件通常是由標准I/O庫實施全緩沖的,在一個流上執行第一次I/O操作時,相關標准I/O函數通常調用malloc等函數來獲得所需的緩沖區。
2)行緩沖:這種情況下,當在輸入輸出中遇到換行符時,標准I/O庫執行I/O操作,因此,當涉及終端設備交互時,才使用行緩沖。
3)不帶緩沖:即標准I/O庫不對字符進行緩沖存儲,那麼這種情況就直接調用的是read、write等系統調用函數。這種情況一般用在需要對輸入輸出及時響應的情況下,如標准出錯流stderr通常是不帶緩沖的。
二、看圖說話
UNIX環境高級編程中文第二版PDF高清版 下載地址 http://www.linuxidc.net/thread-2063-1-1.html
Unix環境高級編程 源代碼地址 http://www.linuxidc.com/Linux/2011-04/34826.htm
Unix環境高級編程源碼編譯 http://www.linuxidc.com/Linux/2011-09/42503.htm
apue.h頭文件(Unix環境高級編程) http://www.linuxidc.com/Linux/2012-01/51729.htm
《Unix環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm
Unix環境高級編程第二版讀書筆記 http://www.linuxidc.com/Linux/2011-04/34235.htm
《Unix環境高級編程》中apue.h的問題 http://www.linuxidc.com/Linux/2013-01/77686.htm