鑑於buffer和cache其實是不同的東西,所以我不用書上所用的概念,buffer就是buffer,cache就是cahce。不明白的小夥伴傳送過去看看:看過這兩張圖,就明白 buffer 和 cache 之間區別
相對於iso c語言定義的標準i/o,posix協議定義的是unbuffered i/o。
所謂無緩衝就是指,直接呼叫system call (read,write)。
看似c 標準io,還多了幾步,但就速度上來說,c庫還是快很多的,請看原因:
如果有過部分程式設計經驗的話應該知道:每個系統呼叫到要從「使用者態」,轉換為「核心態」,這個過程是要消耗大量時間。
所以很多情況下程式設計師都需要想辦法讓系統呼叫的達到合理的次數。
在使用者態下設定buffer,並測試在自己電腦或伺服器上,看看哪個size是最合適的。
我不知道在其他unix類中是什麼情況,但是
在linux中有一種思想:一切皆檔案
linux把幾乎所有的io都虛擬成了乙個檔案,如果我要列印乙份簡歷,我就向印表機fd寫入資料。如果我要向遠處的程式進行網路通訊,我只需要向 socket fd寫入我的資料。
2. 重要的檔案描述符(file descriptor,簡稱fd)
常用檔案操作函式
int open(const char *path, int oflag, …);
2.比較難理解的就是:lseek的whence:是三個巨集定義
新的檔案偏移量off_t lseek(fd, 偏移距離 dis,seek_***)
設定當前距離為cur
seek_set:返回的新偏移量 = 0檔案起始處 + dis
seek_cur:返回的新偏移量 = cur + dis
seek_end:返回的新偏移量 = end + dis
通過對比標準i/o,我發現system call有個缺點就是寫入二進位制檔案是需要自己控制編碼。
比如當我有乙個結構體
struct object
;/**
*當我的資料裡本來就包含'\0'時,
*比如"abcdj12klab\0jdlk\0djfbcjfh"(ps:這是乙個完整的結構體,在記憶體中
*線性排列)。
*我現在必須把這個結構體完整的存入到磁碟中,於是:
*/object obj;
/*賦值obj*/
write(fd, (const
char *)(&obj), sizeof(obj));
但是這次的system call write()僅僅寫入到"abcdj12klab\0"就停止了。
於是涉及到「序列化」的知識了。其實此處最簡單的就是用標準i/o啊。 :)
《APUE》筆記(1) 檔案I O
1 概述 1 unix類作業系統最重要的兩個東東 程序和檔案 2 大多數檔案i o用到的5個函式 open,close,read,write,lseek.還有檔案屬性操作函式 dup,fcntl 3 unix類作業系統的檔案i o是不帶快取的i o unbuffered i o 2 檔案描述符 fi...
APUE讀書筆記(二) 檔案和目錄
1.函式stat stat函式用於返回此命名檔案有關的資訊結構,我們平時使用的shell命令 ls l就是呼叫的stat函式。stat和lstat函式的區別 當檔案為符號鏈結時,stat返回所引用的檔案資訊,即跟隨符號連線 而lstat返回的是符號鏈結本身的資訊,即不跟隨符號鏈結。2.檔案訪問許可權...
學習APUE筆記2 檔案IO
fd是在檔案io中貫穿始終的型別 1 檔案描述符的概念 整形數 陣列下標 檔案描述符優先使用當前可用範圍內最小的 作用域 當前程序 2 檔案io操作 open close read write lseek 1 開啟乙個檔案 int open const char pathname,int flags...