open/read/write/close等檔案系統呼叫介面以及fd與FILE的比較
在Linux系統下,檔案是一個很重要的概念,接下來就介紹一下其相關的介面函式
一、熟悉open/read/write/close等檔案相關係統呼叫介面
1、open函式
註釋:
(1)函式說明:用來開啟一個已經存在的檔案或者建立一個普通檔案
(2)引數解釋:
pathname:要開啟或建立的目標檔案
flags:開啟檔案時,可以傳入多個引數選項,用下面的一個或多個進行“或”運算,構成flags;
引數:O_RDONLY—只讀開啟、 Q_WRONLY—只寫開啟、O_RDWR—讀、寫開啟 ;這三個變數只能指定一個
O_CREAT—若檔案不存在,則建立它。需要使用mode(檔案許可權標誌)選項,來指明新檔案的訪問許可權
O_APPEND—追加寫
(3)返回值:成功返回新開啟檔案的描述符,失敗則返回-1
檔案許可權標誌
檔案許可權標誌也可以使用加權數字表示,這組數字被稱為umask變數,它的型別是mode_t,是一個無符號八進位制數。umask變數的定義方法如表:
2、read函式
//函式原型
ssize_t read(int fd,void *buf,size_t count);
註釋:
(1)函式說明:是從 fd所描述的開啟檔案中讀取 buf所指緩衝區中的 n個位元組。
(2)引數說明
fd:檔案描述符,用來指向要操作的檔案的檔案結構體
buf:一塊記憶體空間
count:請求讀取的位元組數,讀上來的資料儲存在緩衝區buf中,同時檔案的當前讀寫位置向後移。
ssize_t:有符號整型
(3)返回值:成功返回讀取的位元組數,出錯返回-1並設定errno,如果在呼叫read之前已到達檔案末尾,則這次read返回0。
注意:
3、write函式
//函式原型
ssize_t write(int fd,const void *buf,size_t count);
註釋:
(1)函式說明:將 buf所指向的緩衝區的 n位元組寫入 fd 所描述的開啟檔案中
(2)引數說明:
fd:檔案指標
buf:寫入的資料儲存在緩衝區buf中,同時檔案的當前讀寫位置向後移
count:請求寫入的位元組數
(3)返回值:成功返回寫入的位元組數,出錯返回-1並設定errno寫常規檔案時,write的返回值通常等於請求寫的位元組數count,而向終端或者網路寫則不一定。
4、close函式
註釋:
(1)函式說明:關閉指定檔案
(2)引數解釋:fd—檔案描述符,用來指向要操作的檔案的檔案結構體
(3)返回值:若成功返回0,出錯返回-1;
注意:關閉一個檔案時也釋放該程序加在該檔案上的所有記錄鎖,當一個程序終止時,它所有的開啟檔案都由核心自動關閉。
二、對比fd與FILE結構體
1、檔案描述符fd
概念:檔案描述符在形式上是一個非負整數。實際上,它是一個索引值,指向核心為每一個程序所維護的該程序開啟檔案的記錄表。當程式開啟一個現有檔案或者建立一個新檔案時,核心向程序返回一個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述符展開。
(1)習慣上,標準輸入(standard input)的檔案描述符是 0,標準輸出(standard output)是 1,標準錯誤(standard error)是 2。
(2)(2)0,1,2對應的物理裝置一一般是:鍵盤,顯示器,顯示器。
檢視當前最大開啟檔案描述符數
修改當前使用者環境下的最大開啟檔案描述符數 (臨時更改)
2、FILE結構體
struct FILE
{
char *_ptr;//檔案輸入的下一個位置
int _cnt;//當前緩衝區的相對位置
char *_base;//指基礎位置(檔案的起始位置)
int _flag;//檔案標誌
int _file;//檔案的有效性驗證
int _charbuf;//檢查緩衝區狀況,如果緩衝區則不讀取
int _bufsiz;//檔案的大小
char *_tmpfname;//臨時檔名
};
3、(FILE*)檔案指標
檔案指標指向程序使用者區中一個被叫做FILE結構的結構資料。FILE結構包括一個緩衝區和一個檔案描述符 。而檔案描述符是檔案描述符表的一個索引,因此從某種意義上說檔案指標就是控制代碼的控制代碼(在Windows系統上,檔案描述符被稱作檔案控制代碼)。
4、檔案描述符與檔案指標的區別
(1)檔案描述符fd只是一個非負整數,在open時產生,起到一個索引的作用,程序通過PCB中的檔案描述符表找到該fd所指向的檔案指標file。
(2)open函式返回的是一個檔案描述符,核心會在每個程序空間中維護一個檔案描述符表,所有開啟的檔案都將通過此表中的檔案描述符來引用;
(3)fopen函式返回的是一個檔案指標(FILE*),FILE結構是包含有檔案描述符的,fopen可以看做是open(fd直接操作的系統呼叫)的封裝,它的優點是帶有I/O快取
函式fopen()就是返回開啟檔案的指標;如果操作失敗,返回空指標null。