我們在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的日誌資訊,...