linux程式設計之檔案I O

2021-08-14 05:29:25 字數 2939 閱讀 9304

linux下c語言對於檔案的操作,我們會經常用到fopen(),fclose(),fwrite(),fread(),fgets()等一系列庫函式,基本和是和windows下學習c語言一樣的,其實這些庫函式就是在linuxx下對系統呼叫函式的封裝,因此這裡只介紹系統函式下的檔案操作函式。

(一).open()開啟檔案

#include #include #include int open(const char *pathname, int flags);
引數3:mode,當建立檔案時候使用,一般為umask的值。

返回值: 成功返回檔案描述符,否則返回-1.

(二)close,關閉乙個檔案。引數為檔案描述符.

#include int close(int fd);
(三)write,向檔案中寫資料
#include ssize_t write(int fd, const void *buf, size_t count);
(四)read,讀檔案中資料
#include ssize_t read(int fd, void *buf, size_t count);
例如:

#include

(五)lseek,修改檔案偏移量。

#include #include 

注意:當偏移量大於檔案長度時,產生空洞,空洞是由所設定的偏移量超過檔案尾端,並寫了一些資料造成了,其從原檔案尾端到新偏移的位置之間即是產生的空洞。空洞不占用磁碟空間,可以使用:

du filename #檢視檔案所佔實際磁碟空間

ls filename #實際檔案的大小

例如:

#include #include #include #include #include #include #define buff 12 

int main()

if( write(fd,str1,buff) == -1 )

if( lseek(fd,1024,seek_end) == -1 )

write(fd,str2,buff);

return 0;

}

(六)access 判斷檔案是否具有讀,寫,可執行或者是否存在。
#include int access(const char *pathname, int mode);
返回值:滿足mode中的引數並且正確執行則返回0 ,否則返回-1。

(七)dup或dup2,建立乙個檔案描述符,其指向同乙個檔案表。

#include int dup(int oldfd);
在此簡單介紹一下檔案的核心結構:首先計算機系統中有乙個程序表,其中的每個程序表項,該表項中有乙個開啟檔案描述符表,該開啟的檔案描述表中有很多檔案描述符表項,每項包括兩部分:檔案描述符標誌與檔案指標,其中檔案指標指向乙個檔案表,檔案表中存放著檔案的狀態標誌即是否可讀是否可寫,當前檔案的偏移量,還有乙個v節點指標,指標v節點指標指向乙個v節點表,v節點表主要存放檔案的所有者,檔案長度,檔案的裝置以及檔案實際資料塊在磁碟上的位置等一系列資訊。可能這樣描不太清楚,下面用一張圖來描述:

(八)sync與fsync

(對於以下會主要是針對的核心緩衝)由於io操作會首先將資料放入核心緩衝區,所以在寫的時候如果出現系統故障則緩衝區的資料可能會丟失,所以為了防止這種情況發生,以上兩個函式使得核心緩衝區的資料立即寫入磁碟。

#include void sync(void);將所有緩衝排入寫佇列,然後立即返回

int fsync(int fd);將所有緩衝排入寫佇列,直到該緩衝去的資料寫入磁碟後才返回。

int fdatasync(int fd);幾乎和fsync函式相同,只是fdatasync(int fd)函式只影響資料部分,而fsync還會同步更新檔案的屬性。

(九)fcntl函式,該函式可以改變已經發開檔案的性質。
#include #include int fcntl(int fd, int cmd, ... /* arg */ );
arg 可選引數,根據第二個引數填寫。

返回值:出錯返回-1,否則哈返達到的標誌。

例如:

#include #include #include #include int main(int argc,char * argv)

if( val = fcntl(fd,f_getfl,0) == -1 )

printf("%d\n",val);

printf("%d %d %d\n",o_rdonly,o_wronly,o_rdwr);

int n = val & o_accmode;

if( n == o_rdonly)

printf("read\n");

if(o_wronly & val )

printf("write\n");

if( n == o_rdwr)

printf("read and write\n");

}

(十)最後再說一下linux緩衝的問題吧。

linux中有兩個級別的緩衝:io緩衝與核心緩衝

(1)io緩衝:對於標準io操作,都會有乙個緩衝區,當使用者想要寫資料時,首先將資料寫入緩衝區,待緩衝區滿之後才能呼叫系統函式寫入核心緩衝區。當使用者想讀取資料時,首先向核心讀取一定的資料放入io緩衝區,讀操作從緩衝區中讀資料,當讀完io緩衝區的資料時,才能再讀取資料到io緩衝區。

目的:減少對磁碟的讀寫次數,提高工作效率。
(2)核心緩衝區:作業系統核心部分也有緩衝,其與io緩衝區是不同的,其主要區別用一張圖表示:

Linux 環境程式設計之檔案I O 檔案讀寫

函式介面 includessize t read int fd,void buf,size t nbytes ssize t write int fd,const void buf,size t nbytes read使用 write使用 測試 include include include inc...

linux系統程式設計之檔案I O

一 檔案描述符 linux系統中,所有開啟的檔案都對應乙個數字,這個數字由系統來分配,稱為檔案描述符。pcb程序控制塊裡有檔案描述符表,以陣列形式存放於核心區。乙個程序預設開啟3個檔案描述符 stdin fileno 0 stdout fileno 1 stderr fileno 2 新開啟檔案返回...

linux系統程式設計之檔案IO

1.開啟檔案的函式open,第乙個引數表示檔案路徑名,第二個為開啟標記,第三個為檔案許可權 效果測試 列印開啟檔案返回的描述符為3,同時建立了檔案testopen1 2.建立檔案函式creat和關閉函式close 使用 include include include includeint main ...