Linux學習筆記 檔案相關系統呼叫介面

2021-08-20 15:08:49 字數 2250 閱讀 8835

我們在c語言中學習了很多檔案相關的介面,如fopen,fclose,fwrite,fread等等。並且,c會預設開啟三個輸入輸出流u,分別是stdin,stdout,stderr。這三個流的型別都是*file,檔案指標。接下來我們看一下檔案相關的系統呼叫介面,看看它和c語言的檔案介面有什麼關係。

檔案相關系統呼叫介面

open

#include 

#include

#include

int open(const

char *pathname, int flags);

int open(const

char *pathname, int flags, mode_t mode);

/*pathname:要開啟或建立的目標檔案

flags:開啟檔案時,可以傳入多個引數選項,用下面的乙個或者多個常量進行「或」運算,構成flags。

引數: o_rdonly:唯讀開啟

o_wronly:只寫開啟

o_rdwr:讀,寫開啟

(這三個常量,必須指定乙個且只能指定乙個)

o_creat:若檔案不存在,則建立它,需要使用mode選項,來指明新檔案的訪問許可權

返回值:

成功:新開啟的檔案描述符

關閉:-1

*/

close
#include 

int close(int fd);

/*返回值:

0表示關閉成功,-1表示關閉失敗

*/

read
#include 

ssize_t read(int fd, void *buf, size_t count);

/*fd:檔案描述符

buf:讀取的內容裝到這裡

count:讀取檔案的大小

返回值:

實際讀取的位元組數,0,表示讀到檔案結尾,-1,出錯,

實際讀取的位元組個數,並不一定等於count

*/

write
#include 

ssize_t write(int fd, const

void *buf, size_t count);

/*

buf:要想寫出去的資料在**

count:資料的個數

返回值:返回實際寫出去多少個位元組

*/

c語言檔案介面和檔案系統呼叫介面的關係

我們看乙個c檔案介面寫的**:

#include 

#include

int main( void )

const

char *msg = "hello world\n";

int count = 5;

while(count--)

fclose(fp);

return

0;}

再來看乙個用系統呼叫介面寫的**:

#include 

#include

#include

#include

#include

#include

int main()

int count = 5;

const

char *msg = "hello world!\n";

int len = strlen(msg);

while(count--)

close(fd);

return

0;}

執行之後,發現這兩個函式的功能是一模一樣的,這說明什麼問題呢?要搞清楚這個問題之前那,我們先來認識兩個概念:系統呼叫和庫函式

- 庫函式:fopen、fclose、fread、fwrite都是c標準庫當中的函式,我們稱之為庫函式(libc)

- 系統呼叫介面:open、close、write、lseek(重新定位讀/寫檔案偏移量)都屬於系統提供的介面,我們稱之為系統呼叫介面。

再來看一張圖:

系統呼叫和庫函式的關係,一目了然。所以,f#系列的函式,都是對系統呼叫的封裝,方便二次開發。

Linux相關學習筆記 檔案系統

bin 二進位制可執行命令 dev 裝置特殊檔案 外部裝置檔案存在這裡 etc 系統管理和配置檔案 etc rc.d 啟動的配置檔案和指令碼 home 使用者主目錄的基點,比如使用者user的主目錄就是 home user,可以用 user表示 lib 標準程式設計庫,又叫動態鏈結共享庫,作用類似w...

Linux 檔案相關系統呼叫介面(IO)

早期在寫c語言介面的時候,我們可以通過fopen來開啟乙個檔案,下面這段兩段 為例 hello.c寫檔案 1 include 2 include 3 int main 4 9 const char msg hello world n 10 int count 5 11 while count 14 ...

Linux 相關系統日誌檢視

cat var log secure 涉及到賬號登入的日誌資訊都會記錄在此檔案中。journalctl 可以檢視所有 unit 的日誌資訊,日誌的配置檔案 etc systemd journald.conf 2.1 journalctl 用法 u 根據unit進行過濾,檢視kubelet的日誌資訊,...