首頁 > 軟體

Linux 檔案系統呼叫函數open close read write lseek perror

2020-06-16 17:27:10

Linux系統中操作檔案有兩種方式,一種是標準C的檔案執行函數,一般以f開頭,fopen,fread,fwrite等等,這種操作執行是帶快取的,一般系統會對它進行優化,另外一種是系統呼叫,open, close, read, write, lseek,也就是我們今天要分享的,這種不帶快取,直接讀和寫都是真實的資料,一般在驅動中需要用到這種方式,這一篇先來分享系統呼叫的幾個函數,下一節再分享標準C的檔案操作函數 http://www.linuxidc.com/Linux/2016-11/137613.htm

1 open
所需標頭檔案:

函數原型:int open(const char *pathname,flags,int perms)
pathname:被開啟的檔名,可包含路徑
flag :檔案開啟的方式,引數可以通過“|” 組合構成,但前3 個引數不能互相重合。
O_REONLY :唯讀方式開啟檔案
O_WRONLY :可寫方式開啟檔案
O_RDWR :讀寫方式開啟檔案
O_CREAT :如果檔案不存在時就建立一個新檔案,並用第三個引數為其設定許可權。
O_EXCL :如果使用O_CREAT 時檔案存在,則可返回錯誤資訊。這一引數可測試檔案是否存在。
O_NOCTTY :使用本引數時,如檔案為終端,那麼終端不可以作為呼叫open ()系統呼叫的那個進程的控制終端。
O_TRUNC :如檔案已經存在,並且以唯讀或只寫成功開啟,那麼會先全部刪除檔案中原因資料。
O+APPEND :以新增方式開啟檔案,在開啟檔案的同時,檔案指標指向檔案末尾。
perms:許可權,可以用數位表示

返回值,成功返回檔案描述符,失敗返回-1

2 close
函數原型:int close (int fd )
函數輸入值:fd :檔案描述符
函數返回值:成功:0 出錯:-1

來看個例子:

先讓使用者輸入一個檔案,以可讀可寫的方式開啟,如果不存在就建立,許可權是0666

hello就是新建立的檔案
我們看下hello的許可權

並不是0666,而是0644,這是因為umask,umask我們前面總結過了

是相剪的結果,我們可以在程式碼中指定umask的值為0000,那麼我們建立的這個hello就是正確的許可權了

再來試下

我們看到現在hello的許可權就是0666了

3 read
所需標頭檔案:

函數原型:ssize_t read(int fd,void *buf,size_t count)
fd: 檔案描述符
Buf :指定記憶體讀出資料的緩衝區
Count :指定讀出的位元組數
函數返回值:成功:讀出的位元組數 0 :已到達檔案尾 -1 :出錯

看例子:

我們先建立一個read.txt,隨便寫點內容


memset是分配記憶體空間

4 write
所需標頭檔案

函數原型: ssize_t write(int fd,void *buf,size_t count)
函數傳入值:
fd: 檔案描述符
Buf :指定記憶體寫入資料的緩衝區
Count :指定讀出的位元組數
函數返回值:成功:已寫的位元組數 -1 :出錯

例子:

5 lseek
所需標頭檔案

函數原型:off_t lseek(int fd,off_t offset,int whence)
函數傳入值:
fd: 檔案描述符
Offset :偏移量,每一讀寫操作所需要移動的距離,單位是位元組的數量,可正可負(向前移,向後移)
Whence :當前位置的基點:
SEEK_SET :當前位置為檔案開頭,新位置為偏移量的大小
SEEK_CUR :當前位置為檔案指標位置,新位置為當前位置加上偏移量
SEEK_END :當前位置為檔案的結尾,新位置為檔案的大小加上偏移量大小

例子:

下面我們用一個大的例子把上面分享的東西串起來:
讀一個檔案的全部內容,寫入到另外一個檔案
先看看file.in的內容

6 perror
一般遇到錯誤的時候,系統會把錯誤報錯在全域性變數errorno中,我們可以用perror列印出具體的報錯資訊,perror函數中的字串相當於標題,看個例子

好了,Linux 檔案系統呼叫函數open close read write lseek perror就總結到這裡,如有問題,歡迎指正,謝謝。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137612.htm


IT145.com E-mail:sddin#qq.com