APUE 學習筆記 檔案I O

2022-08-18 00:39:23 字數 2299 閱讀 2002

本章節主要講了 linux 系統下的關於檔案i/o操作的幾個函式:open、read、write、lseek、close 的使用和需要注意的一些細節。接著,又介紹了多程序見如何共享檔案。下面開始知識點梳理。

對於核心來說,所有開啟的檔案,都是通過檔案描述符來引用。當開啟或建立乙個新的檔案的時候,核心都會向程序返回該檔案的檔案描述符。檔案描述符是什麼,可以參考維基百科——檔案描述符。unix 系統按慣例,會將0與程序的標準輸入關聯,將1與程序的標準輸出關聯,將2與程序的標準錯誤關聯。

creat函式是以只寫的形式來開啟乙個新的檔案的。

關閉乙個檔案,會關閉該程序在當前檔案上加的所有記錄鎖。乙個程序結束之後,核心會自動關閉其開啟的所有檔案。

lseek 函式僅會將當前的檔案偏移量記錄到核心中,其不會引起任何 i/o 操作。該偏移量是用來進行下一次讀或者寫的游標。偏移量的大小可以與檔案實際大小不對應。當大於檔案當前的實際長度的時候,對該檔案的下一次寫將加長該檔案,且會形成乙個空洞。位於檔案中但是沒有寫過的位元組都讀為0。具體什麼是空洞,可以看下百科——檔案空洞。

如果 read 成功,則會返回讀到的位元組數。如果已經讀到了檔案的末尾,會返回0。

大多數檔案系統為改善效能,都會增加「預讀」技術。當檢測到正在進行順序讀取時,系統就試圖讀入比實際鎖要求更多的資料。

unix 系統支援不同程序之間共享開啟檔案。核心使用三種資料結構用來表示開啟檔案:

(1)每個程序在程序記錄表中都會有乙個記錄項,記錄項中包含一張開啟檔案描述符表。有每個檔案描述符相關聯的是:

a)檔案描述符標誌;

b)指向乙個檔案表項的指標;

(2)核心為所有開啟檔案維持一張檔案表,每個檔案表項包含:

a)檔案狀態標誌;

b)當前檔案的偏移量;

c)指向該檔案v節點表項的指標;

(3)每個開啟檔案(或裝置)都有乙個v節點結構。

該圖顯示了乙個程序開啟多個檔案的場景。開啟檔案描述符表可以存放在使用者空間,而非程序表中。

該圖展示了多個獨立的程序開啟同乙個檔案的場景。此場景在讀的時候,可以正確的讀。但是當涉及到寫檔案,就會存在了一些不可預料的結果。

兩個函式都是用來複製乙個現有的檔案描述符的。有 dup 返回的新檔案描述符一定是當前可用檔案描述符中的最小值,對於 dup2,可以用fd2引數指定新描述符的值。如果fd2已經開啟,則將其關閉先。若fd=fd2,則dup2返回fd2,而不關閉它。

![dup(1) 後的核心資料結構說明

傳統的unix系統都會在核心中設有緩衝區告訴快取或頁快取記憶體,大多數磁碟io都是通過緩衝區進行。當向檔案寫資料時,核心通常會先將資料copy到緩衝區中,然後排入佇列,晚些時候會寫入到磁碟中,這被稱為延遲寫。當核心需要重用緩衝區來存放其他睡的時候,會將所有資料寫入到磁碟中。為了保證磁碟上實際檔案系統與緩衝區中內容的一致性,unix系統提供了三種函式,如上。它們有什麼區別呢?

fcntl 函式可以改變已經開啟的檔案的屬性。

fcntl 的返回值與命令有關。如果出錯,所有命令都返回-1;成功會返回其他值。

在修改檔案描述符標誌或檔案狀態標誌的時候必須謹慎,先要獲取現在的標誌值,然後再按照期望修改它,最後設定新的標誌值。本小節還講到了呼叫write時設定同步機制後,對系統效能帶來的影響。

APUE學習筆記 檔案IO

1 lseek的返回值應該判斷是否為0,而不是小於0。2 偏移量可以大於檔案大小。這個時候會有檔案空洞。4 open加上標誌 o create和o excl可以判斷檔案是否存在。5 dup和dup2可複製檔案描述符。並可指定複製後的描述符。6 linux ext2檔案系統不支援o sync標誌。可以...

APUE 學習筆記 1 Unix檔案IO

標頭檔案 為了節省時間,僅簡單記錄函式的名字忽略原型,重點在於記下自己實踐中的感悟。function creat open close read write lseek fcntl file io.h pragma once include include include apue.h includ...

學習APUE筆記2 檔案IO

fd是在檔案io中貫穿始終的型別 1 檔案描述符的概念 整形數 陣列下標 檔案描述符優先使用當前可用範圍內最小的 作用域 當前程序 2 檔案io操作 open close read write lseek 1 開啟乙個檔案 int open const char pathname,int flags...