Linux系統程式設計(第三章)筆記

2021-10-14 15:54:32 字數 3116 閱讀 6603

由於塊是檔案系統中最小儲存單元的抽象,在核心中,所有檔案系統操作都是基於塊來執行。因此所有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運算 符號...