基礎IO 和 Linux 的檔案系統

2021-10-04 13:19:28 字數 2993 閱讀 3982

基礎io:標準庫io介面 / linux下系統呼叫io介面 / 檔案描述符 / 重定向 / 檔案系統 / 庫檔案

標準庫的io介面:fopen / fwrite / fread / fseek / fclose

fread / fwrite 比較推薦塊帶下為1,塊個數是想要操作的資料長度

feek: 檔案沒有資料也可以跳轉讀寫位置

對檔案資料進行字串操作的時候要注意檔案資料中的 \0 這種資料

標準庫中的 io — 都是庫函式 — 庫函式就是對系統呼叫介面的一種封裝

系統呼叫介面:open / read / write / lseek / close

ssize_t write(int fd,char *buf,size_t count);

fd:open返回的檔案描述符 – 檔案操作控制代碼

buf:要寫入檔案的資料空間首位址

count:要寫入檔案的資料大小

返回值:返回實際寫入檔案的資料位元組長度;失敗返回 -1;

ssize_t read(int fd,char *buf,size_t len);

fd:open返回的檔案描述符

buf:從檔案中讀取資料放到哪塊緩衝區中的首位址

len:想要讀取的資料長度,注意這個len不能大於緩衝區的大小

返回值:返回的是十幾度渠道的資料自己長度,錯誤返回 -1

off_t lseek(int fd,off_t offset,int whence);

fd:open返回的檔案描述符

offset:偏移量

whence:從**開始偏移 seek_set – 檔案起始位置 seek_cur – 檔案當前讀寫位置 seek_end – 檔案末尾

返回值:成功返回當前位置相對於起始位置的偏移量;失敗返回 -1

int close(int fd); – 通過檔案描述符關閉檔案,釋放資源

檔案描述符:是乙個非負整數 – 操作檔案的控制代碼

檔案描述符其實就是核心中乙個程序開啟的檔案描述資訊的下標 – 通過這個下標可以在核心中找到相應的檔案描述資訊,通過這個檔案描述資訊,可以實現檔案的操作,實際上是乙個數字,從 3 開始,因為 0 1 2被比標準輸入標準輸出和標準錯誤佔了

為什麼開啟乙個檔案,如果不操作了一定要關閉,釋放資源;檔案描述符實際是有限的,檔案描述符用光,則程序中就打不開新檔案了

乙個程式執行起來,程序中缺省會開啟三個檔案:標準輸入 - 0 -stdin / 標準輸入 - 1 -stdout / 標準錯誤 - 2 -stderr

printf 是列印資料到標準輸出, close(1),就是把標準輸出關閉了,開啟新檔案後,printf並沒有直接把資料列印出來,而是在重新整理緩衝區之後,將資料寫到檔案中

printf 並非真的一定要把資料寫入標準輸出檔案,而是因為printf函式中操作檔案的時候的描述符是 1

原本向 1 中寫入資料,就是向標準輸出寫入,然後當 1指向新檔案後,這時候printf就會將資料寫入到指定新的檔案中

重定向:將資料不再寫入原本的檔案,而是寫入新的指定檔案中 – 實現方式就是替換這個描述符對應的檔案描述資訊

實際上是描述符的重定向,改變描述符所指向的檔案,就改變了資料的流向

檔案系統:linux下的ext2檔案系統為例

儲存乙個檔案需要找到空閒的磁碟塊儲存檔案資料,以及找到乙個未被使用的 inode節點儲存自己的元資訊,針對每乙個磁碟塊做乙個整體的點陣圖,這樣就可以快速找到空閒的磁碟塊,類似於目錄。

檔案的許可權就是使用位圖儲存:乙個使用者有沒有許可權就是 0 / 1的關係;位圖可以節省大量的空間以及二進位制的與或非是很快的。

位圖:一連串的二進位制位元位,用來做一種資料標記

檔案儲存流程:通過超級塊找到 inode 位圖 / 資料塊點陣圖,通過資料塊點陣圖快速的找到空閒的磁碟塊儲存檔案資料,通過inode 位圖快速找到空閒的 inode節點儲存檔案的元資訊。 – 檔案資料儲存完畢,每個檔案擁有唯一的 inode節點。檔案的資料儲存完畢之後,還需要在這個檔案的所在目錄下(目錄檔案中),記錄這個檔名稱以及inode節點號(目錄項)

檔案讀取流程:通過檔名開啟乙個檔案,在所在的目錄檔案中通過檔名找到這個檔案的 inode節點號,在磁碟超級塊中找到 inode節點區域,根據inode節點號,快速找到inode節點,得到資料儲存的磁碟塊號,取出資料。

庫檔案:打包了一堆實現了常用功能的**檔案

將各個 .c 檔案編譯彙編成目標檔案

例如:gcc -c chile.c -o chile.o

動態庫打包:gcc -c -fpic child.c -o child.o -> gcc shared child.o -o libmychild.so;動態庫的命名方式 lib***.so

靜態庫打包:gcc -c child -o child.o -> ar -cr libmychild.a child.o 靜態庫命名方式 lib***.a

庫的使用必須將庫檔案放到指定的路徑下

設定連線庫的搜尋路徑環境變數 – 將當前庫檔案所在的路徑新增進去: export ld library_path=$ld_library_path

使用gcc -l選項指定連線庫的搜尋路徑:gcc main.c -o main -l./ -mychild

ldd main 檢視main這個可執行程式以來的動態庫

執行可執行程式時載入使用:僅僅針對動態庫才會在執行時載入庫檔案

將靜態庫放到指定的路徑下,然後使用–l指定靜態庫的位置:gcc main.c -o main -l./lib -lmychild

Linux檔案系統I O

作為一名c 後台開發程式設計師,在這個領域需要不斷的學習進步,才能夠穩定前行。對於畢業工作了一年的我,在著期間,對於linux系統可以說是很少接觸,因為現在的專案主要是windows專案。但是,個人認為,作為後台開發工程師,linux系統的學習是必須的,最起碼要熟悉linux系統。而對於幾乎沒接觸過...

Linux檔案系統基礎

一 檔案系統層次分析 由上而下主要分為使用者層 vfs層 檔案系統層 快取層 塊裝置層 磁碟驅動層 磁碟物理層 使用者層 最上面使用者層就是我們日常使用的各種程式,需要的介面主要是檔案的建立 刪除 開啟 關閉 寫 讀等。vfs層 我們知道linux分為使用者態和核心態,使用者態請求硬體資源需要呼叫s...

Linux檔案IO之ext檔案系統

2 ext2檔案系統 3 目錄與檔案 ext是linux比較通用的檔案系統,全稱延伸檔案系統,又稱擴充套件檔案系統。其中ext2是ext檔案系統版本中第乙個商用檔案系統版本,後續的ext3和ext4都是在此基礎上優化。所有磁碟都有乙個mbr頭和至多4個主分割槽組成。mbr叫主引導記錄,位於磁碟第乙個...