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

2021-09-08 23:25:18 字數 3102 閱讀 4959

早期在寫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 fclose(fp);

15 return 0;

16 }

hello.c讀檔案

1 #include 2 #include 3  int main ()

4 9 char buf[1024];

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

11 while(1)

17 if(feof(fp))

20 }

21 fclose(fp);

22 return 0;

23 }

顯而易見,是要往「myfile」檔案中寫五條「helloworld」,再通過讀檔案介面讀出來。這裡我們運用了fwrite、fread這些c語言介面。

如果我們想把乙個字串顯示在顯示器上,我們可以用printf、putchar、fputchar、fputs、fprintf、fwrite.......等等一系列介面。而我們也知道任何乙個程序在啟動之後,預設開啟三個輸入輸出流,分別為stdin、stdout、stderr,分別對應的裝置是鍵盤、顯示器、顯示器。仔細觀察發現,這三個流的型別都是file*,我們用fopen開啟檔案該返回值的型別就是file*。而這個file*是c語言提供的資料型別,所以說,這三個流與c語言強相關,都是c語言提供的介面。

這是我們的作業系統結構,通過這張圖以及之前的知識我們知道,作業系統對上提供穩定高效的執行環境,對下管理軟體硬體,作業系統不會直接將自己的每個管理模組暴露出來給使用者,而是通過一系列的系統呼叫介面。而剛剛提到的c語言提供的那些介面都是處於使用者操作介面的lib中

但是剛才的**表明我們最終將訊息列印到了顯示器上,即硬體。可是c庫操作介面在上層的使用者操作介面處,而硬體是在下面的硬體部分,所以說明我們必定要將要寫入的資料自頂向下的交付給底層的硬體,但是要交付肯定不是c庫直接去交付,因為我們沒有這個權利,這就必定要通過作業系統來完成,也就是要通過系統呼叫介面。也就是說,我們的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

模擬c庫呼叫介面,我們明白fopen底層必定呼叫了open。 下面用檔案的系統呼叫介面來實現剛剛的**

hello.c寫檔案

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7  

8 int main ()

9 16 int count = 5;

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

18 int len = strlen(msg);

19 while (count--)

22 close(fd);

23 return 0;

24 }

hello.c讀檔案

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

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

SOCKET使用者介面與系統呼叫關係

所有的socket系統呼叫的總入口是sys socketcall 在include linux syscalls.h中定義 其中,param call 標識介面編號,param args 是介面引數指標 介面編號的定義在 include uapi linux net.h中定義 介面編號對應的引數個數...

Linux的常用檔案系統呼叫介面

在linxu中也有相對應的檔案系統呼叫介面,如open read write lseek close等,以下列舉這幾個介面的具體用法 1.openint open const char pathname,int flags,mode t mode 2.readssize t read int fd,...