1. 程式人生 > >Linux檔案IO(檔案的讀寫)

Linux檔案IO(檔案的讀寫)

內容源於朱友鵬老師的課程筆記的學習整理,如有侵權,請告知刪除。

一、linux中如何管理檔案

(1)硬碟中的靜態檔案和iNode(i節點)

  • 內容管理表 + 真正儲存的內容;
  • 內容管理表以檔案為單位進行管理,每個檔案一個結構體(即iNode);
  • 平常說的快速格式化,其實就是把內容管理表刪除,真正的內容沒有被刪除。

(2)記憶體中的動態檔案和vnode(v節點)

  • 每個程序都有一個數據結構(叫程序資訊表),記錄了該程序的所有資訊;
  • 程序資訊表中有一個指標指向一個檔案管理表(叫檔案描述符表);
  • 檔案描述符表記錄了當前程序開啟的所有的檔案及其資訊,即檔案描述符與檔案表指標。檔案描述符相當於陣列下標,陣列的值是檔案表指標。
  • 其中檔案表指標指向了檔案表,檔案表中包含V節點指標、當前檔案位移量(即檔案指標所處的位置;在動態檔案中,檔案指標表示當前在檔案流的哪個位置)。
  • 如圖:

二、一些概念

  • API 的一些概念

(1)基於linux做應用開發,其實就是通過呼叫linux系統提供的API來實現;

(2)API 是一些由linux系統提供的函式,給應用層使用,以完成一定的功能。

(3)常用的檔案IO的API 有open,close,write,read,lseek等。

  • 檔案描述符(fd)

(1)實質就是一些非負整數,用來區分一個程式開啟的多個檔案;

(2)作用域是當前程序,也就是說,不同程序下開啟的檔案的檔案描述符可以是相同的數字;

(3)fd從0開始,依次增加。其中0,1,2已經被stdin,stdout,stderr這3個檔案佔用,也就是說,當執行一個程式時,預設打開了上述三個檔案,即把鍵盤、螢幕當做檔案。

  • 檔案IO和標準IO的異同

(1)標準IO是C庫函式,檔案IO是系統提供的API;

(2)C庫函式由API封裝而來;

(3)C庫函式具有移植性,而API是針對具體的系統設計的;

(4)標準IO帶有快取,而檔案IO沒有快取。

  • man手冊的查詢

     man  1  xxx    查詢linux的shell命令

     man  2  xxx    查詢API

     man 3   xxx    查詢庫函式

  • 退出程序

(1)開啟檔案時如果就出錯了,後面的操作就應該不再進行。如 _exit(-1)

(2)退出程式:在main中用return,正常return 0,異常return -1;典型的終止程序應該用exit,_exit,_Exit,後二者是系統API,前者是庫函式。 

  • 檔案的重定位(即把向螢幕輸出的內容,輸出到某個檔案)

            fd1=open("檔名",flag) ;       

            close(1);

            fd2=dup(fd1);

三、常見的API

(1)常用檔案IO的API 有open,close,write,read,lseek,dup,dup2,fcntl等,具體使用方法可以檢視man手冊;

(2)注意open裡面的flag對檔案操作的影響。