檔案IO操作的意義

2021-07-22 06:23:44 字數 1497 閱讀 1204

linux的檔案結構:

在linux中,幾乎一切都可以看做是檔案來處理,檔案是作業系統與具體物理裝置之間的乙個簡單而統一的介面。所以,我們在程式中可以像使用檔案那樣去讀寫磁碟、操作串列埠、印表機等其他裝置。常用的檔案操作函式有,open、read、write、lseek。

那麼核心如何區分和引用特定的檔案呢?那就是通過

檔案描述符

啦,檔案描述符其實就是一些小值整數,我們可以通過這些整數傳遞給檔案操作函式從而達到訪問到具體哪乙個檔案。簡單的說,檔案描述符是乙個非負的整數,它是乙個索引值,並指向核心中每個程序開啟檔案的記錄表。當開啟乙個現有的檔案或者新建乙個檔案時,核心就向程序返回乙個檔案描述符。當需要讀寫檔案時,就把檔案描述符作為引數傳遞給相應的檔案操作函式。

通常來說,當乙個程序執行時,都會自動開啟三個檔案:標準輸入(鍵盤)、標準輸出(螢幕)、標準出錯處理(螢幕)。這三個檔案對應的檔案描述符分別為0、1、2.(對應的巨集為stdin_fileno、stdout_fileno、stderr_fileno)。

系統呼叫:

所謂的系統呼叫其實就是作業系統提供給使用者程式呼叫的一組「特殊的介面」,使用者程式可以通過這個特殊的介面獲得作業系統核心提供的服務。那麼,我們就有疑問了?為啥作業系統不直接讓使用者直接訪問核心,還搞出個「特殊的介面」,這不多此一舉嗎?非也非也,linux操作在安全方面考慮的比較周到,為了更好的保護核心空間,將程式執行空間分為使用者空間(0-3g)和核心空間(3g-4g),它們分別執行在不同的等級上,在邏輯上是相互分離的。通常情況系,使用者程序在通常情況下不允許訪問核心資料,也就不能訪問核心函式,它們只能操作使用者資料,呼叫使用者函式。

但是,在有些情況下,使用者空間程序需要獲得一定的系統服務(呼叫核心的函式),這時作業系統就必須利用系統提供給使用者的「特殊介面」——呼叫系統規定使用者程序進入核心空間的具體位置。進入系統呼叫時,程式執行空間需要從使用者空間進入核心空間,處理完之後再返回使用者空間。

庫函式:

在輸入輸出操作中,直接使用底層系統呼叫的問題是它們的效率非常低。為什麼啊?

(1)與函式呼叫相比,系統呼叫的開銷明顯要大,因為在執行系統呼叫的時,linux必須從使用者態轉換到核心態,還要返回使用者態。多費勁吶~~減少這種開銷的方法是,在程式中儘量減少呼叫次數(廢話、這誰都知道),並且讓每次系統呼叫完成盡可能多的工作(不要每次只寫乙個字,讀乙個字,多累啊)(我們最好像讀磁碟資料一樣,一次性大批量的讀取它。哈哈~~)

(2)硬體會對底層系統呼叫一次所能讀寫的資料塊做出一定的限制。

為了給裝置和磁碟檔案提供乙個更高層更有效的介面,linux提供了一系列的標準函式庫。這些函式庫提供

輸出緩衝功能的標準io庫

就是這樣乙個例子。我們可以高效的寫任意長度的資料塊,函式則在資料滿足資料長度要求時安排執行底層系統呼叫(通俗的講就是,比如:郵遞員告訴你,你有郵件了快來拿,然後你屁顛屁顛的去拿,拿了就回家。不久之後,他又打**告訴你,你有郵件快來拿,然後你再屁顛屁顛的去拿,拿了又回去。再不久之後,他又來**告訴你,你又有郵件了快來拿吧,結果你說,你個屌絲能不能一次性三個郵件一起拿給我啊?)帶緩衝功能的標準io庫就是一次性給你三個郵件的好郵遞員啦~~

檔案IO操作

在對乙個檔案或者裝置進行讀寫之前,都需要先開啟,以獲得該檔案或者裝置的操作指標,也就是檔案描述符。有了檔案描述符,後續就可以進行讀取,修改操作了。標頭檔案函式宣告 int open const char pathname,int flags,mode t mode 返回值成功 返回檔案描述符 失敗 ...

檔案操作IO

dup oldfd 和dup2 oldfd,newfd 這兩個函式我們可以用來複製檔案描述符。1 其中oldfd和newfd分別是複製前檔案描述符和複製後的檔案描述符。2 這兩個函式的呼叫都將複製檔案描述符oldfd,且他們的返回值都為新的檔案描述符。3 不同點是dup 的返回值是最小的未用檔案描述...

IO操作 檔案IO

一 系統呼叫 系統呼叫實際上是作業系統 核心 提供的供使用者使用的介面函式。二 標準io函式和檔案io函式的關係 標準io是c庫內定義的函式,是凌駕於系統之上的,適用於任何的作業系統 檔案io是由linux系統提供的,只能在linux系統中使用,而不可以在其它作業系統中使用。標準io函式可以呼叫檔案...