文章目錄
- 鋪墊
- 文件的系統調用接口
- 文件描述符
- 緩沖區
鋪墊
- 文件=文件內容 + 文件屬性
- 訪問文件之前,都要先打開文件,而要訪問,修改,編輯文件,文件就必須加載到內存中
- 程序運行起來變成進程,被CPU調度,打開文件
- 文件分為內存文件和磁盤文件。內存文件:一個文件在被進程訪問
- 一定時間段內,系統中存在多個進程,也可能同時存在更多的被打開的文件,所以操作系統要對打開的文件進行管理:先描述,在組織。所以操作系統中一定要有描述被打開文件的結構體。
所以進程和文件一定是密切相關的。
文件的系統調用接口
我們知道,操作系統要對軟硬件資源做管理,所以要想訪問文件,不能直接操作,必須調用系統調用。
filename:要打開的文件名
flags:打開文件時可以傳入多個參數選項,用一個或多個參數進行或運算
參數:
O_WRONLY:只寫打開
O_RDONLY:只讀打開
O_RDER:讀寫打開
O_CREAT:如果文件不存在就創建
O_TRUNC:打開文件時清空文件內容
O_APPEND:追加寫
mode:創建文件時的權限
所以fopen中,
w = O_CREAT | O_WRONLY | O_TRUNC
a = O_CREAT | O_WRONLY | O_APPEND
r = O_RDONLY
open系統調用成功時返回新打開的文件描述符,失敗返回-1
同樣的,其他系統調用都會用到文件描述符fd
文件描述符
創建一批文件,發現文件描述符從3開始不斷遞增,那么0,1,2呢?
Linux進程默認情況下會右3個缺省打開的文件描述符,分別是標準輸入0,標準輸出1,標準錯誤2。
所以文件描述符就是從0開始的整數,文件描述符的分配規則:找到從0開始的最小的沒有被使用的整數作為新的文件描述符。當我們打開文件時,操作系統要創建出對應的內核數據結構管理文件,于是就有了file結構體,表示一個被打開文件。進程執行open系統調用,就必須讓進程和文件關聯起來,每個進程都有一個指針files,指向一張表files_struct,每個元素都指向一個被打開文件,下標就是被打開文件的文件描述符。所以文件描述符的本質就是數組下標。
緩沖區
緩沖區本質是一塊內存區域,我們說的緩沖區和內核中的緩沖區沒有關系,是語言層面的緩沖區,C語言自帶緩沖區。
為什么要有緩沖區:a.提高使用者的效率 b.聚集數據,一次拷貝,提高整體效率,減少拷貝次數,調用系統調用是有成本的。
文件緩沖區在哪:文件緩沖區是被FILE結構體所維護的,一個文件維護一個緩沖區。