由於塊是檔案系統中最小儲存單元的抽象,在核心中,所有檔案系統操作都是基於塊來執行。因此所有i/o操作都是在塊大小或者塊大小的整數倍上執行。
假設要讀取1024個位元組,每次讀乙個位元組需要1024次呼叫,而如果乙個讀取1024位元組的塊則只需要呼叫一次。對於這種提公升其效能的途徑是「使用者緩衝i/o」。
使用者緩衝i/o
使用者緩衝i/o在使用者空間完成,類似核心通過延遲寫,合併相鄰i/o請求以及預讀等操作來緩衝資料的這些方法提高效能。
當資料被寫入時,它會被儲存到程式位址空間的緩衝區中。當緩衝區資料大小達到給定值,即緩衝區大小,整個緩衝區會通過一次寫操作全部寫出。同樣讀操作也是一次讀入緩衝區大小且塊對齊的資料。
標準i/o
c標準庫中提供了標準i/o庫(簡稱stdio),它實現了跨平台的使用者緩衝解決方案。這個標準i/o庫使用簡單,且功能強大。
檔案指標
標準i/o程式集並不是直接操作檔案描述符。相反,它們通過唯一識別符號,即檔案指標來操作。在c標準庫里,檔案指標和檔案描述符一一對映。
在標準i/o中,開啟的檔案稱為「流」。流可以被開啟用來讀(輸入流),寫(輸出流)或者二者兼有(輸入/輸出流)。
檔案操作
fopen():
#include
file*
fopen
(const
char
*path,
const
char
*mode)
;
該函式根據mode引數,按指定模式開啟path所指向的檔案,並給它關聯上新的流。
fdopen():
#include
file*
fdopen
(int fd,
const
char
*mode)
;
fdopen()的可能模式和fopen()相同,而且必須和初始開啟檔案描述符的模式匹配。可以指定模式w和w+,但是它們不會清空原檔案。流指標指向檔案描述符指向的檔案位置。
fclose():
#include
intfclose
(file *stream)
;
在關閉前,所有被緩衝但還沒有寫出的資料都會被寫出。還有一種fcloseall哈數關閉和當前程序相關聯的所有流包括標準輸入,標準輸出和標準錯誤。linux特有的。
一旦檔案描述符被轉換成流,則在該檔案描述符上不應該直接執行i/o操作,雖然這麼做是合法的。需要注意的是,檔案描述符並沒有被複製,而只是關聯了乙個新的流。關閉流也會關閉相應的檔案描述符。
fgetc():
#include
intfgetc
(file *stream)
;
該函式從stream中讀取乙個字元,並把該字元強制型別轉換成unsigned int返回。ungetc()把讀取的乙個字元放回流中。
fgets():
#include
char
*fgets
(char
*str,
int size,file *stream)
;
該函式從stream中讀取size-1個位元組的資料,並把結果儲存到str中。讀取二進位制資料有fread()。
寫入流資料操作有fputc(),fputs(),fwrite()等等。
定位流fseek():
#include
intfseek
(file *stream,
long offset,
int whence)
;
fseek()函式是標準i/o最常用的定位函式,控制stream指向檔案中由引數offset和whence確定的位置。還提供了其他函式:fsetpos(),rewind(),ftell()。
flush(重新整理輸出)流
fflush():
#include
intfflush
(file *stream)
;
呼叫該函式時,stream指向的流中所有未寫入的資料會被flush到核心中。如果stream是空的,程序中所有開啟的流都會被flush。成功時返回0,失敗時返回eof。
錯誤和檔案結束
ferror():
#include
intferror
(file *stream)
;
判定給定的stream是否有錯誤標誌。feof()用於判斷指定stream是否設定了檔案結束標誌,clearer()函式會清空指定stream的錯誤和eof標誌。
獲取關聯的檔案描述符
fileno():
#include
intfileno
(file *stream)
;
成功時返回和指定stream關聯的檔案描述符。失敗時返回-1.
控制緩衝
setbuf():
#include
intsetvbuf
(file *stream,
char
*buf,
int mode,size_t size)
;
mode值必須是以下之一:_ionbf(無緩衝),_iolbf(行緩衝),_iofbf(塊緩衝)。
執行緒安全
手動檔案加鎖
flockfile():
#include
void
flockfile
(file *stream)
;
等待指定stream被解鎖,然後增加自己的鎖計數,獲得鎖,該函式的執行執行緒成為流的持有者,並返回。
funlockfile():
#include
void
funlockfile
(file *stream)
;
減少和指定stream關聯的鎖計數。如果鎖計數值為0,當前執行緒會放棄對該流的持有權,另乙個執行緒可以獲得鎖。 linux系統程式設計 第三章
作為檔案系統的抽象,它是io中最基本的概念,所有的磁碟操作都是基於塊進行的。作業系統效率隨著系統呼叫次數的增多而急劇下降。每次讀寫操作位元組數太少,會導致讀寫次數增多而降低效率 每次讀寫不是塊大小的整數倍,也會因為對齊資料而降低效率。系統呼叫stat可以輕鬆指定裝置的塊大小。現實中程式很少以塊為單位...
Linux系統程式設計 第三章 緩衝輸入輸出
1 使用者緩衝io 在使用者空間實現的緩衝區,用於將程式的多次輕量級的io請求組合起來,提高操作效率。2 標準io 屬於c語言標準庫,因此檔案開啟,關閉,讀寫都是通過標準io庫完成的。3 檔案指標 file 在c標準庫中,不屬於核心,實際上對映到核心的檔案描述符 4 檔案操作 一下提到的緩衝區是由c...
第三章筆記
第三章預習筆記 一 高階語言和機器指令中的運算 1,按位運算 符號 按位or運算 符號 按位and運算 符號 表示按位not運算 符號 按位xor運算。實現掩碼操作 通過與給定的乙個位模式進行按位與,可以提取所需要的位,對這些位進行 置1 清0 等。2,符號 按位or運算 符號 表示and運算 符號...