早期在寫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: 要開啟或建立的目標檔案模擬c庫呼叫介面,我們明白fopen底層必定呼叫了open。 下面用檔案的系統呼叫介面來實現剛剛的**flags: 開啟檔案時,可以傳入多個引數選項,用下面的乙個或者多個常量進行「或」運算,構成flags。
引數:
o_rdonly: 唯讀開啟
o_wronly: 只寫開啟
o_rdwr : 讀,寫開啟
這三個常量,必須指定乙個且只能指定乙個
o_creat : 若檔案不存在,則建立它。需要使用mode選項,來指明新檔案的訪問許可權
返回值:
成功:新開啟的檔案描述符
失敗:-1
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,...