理解inode
- 檔案系統
- ext2檔案系統inode
- 創建檔案的程序
- 軟硬鏈接
- 軟連接
- 硬鏈接
- 軟硬鏈接區別:
- 三個時間
- 動靜態庫
- 原理
- 動靜態庫區別:
- 靜態庫的打包和使用
- 打包
- 使用
- 動態庫的打包和使用
- 使用
檔案系統
本篇文章接上一篇(Linux基礎IO),
理解檔案系統首先來了解一下磁盤,下面看圖片:

磁盤盤片:主要記錄資料的部分
扇區:為最小的物理存盤單位,扇區組成的圓就是柱面,
磁盤尋找檔案的步驟:
1.先找哪個盤面
2.在找哪個柱面
3.最后確定在哪個扇區
經過以上的3個步驟就確定要讀寫的檔案,
ext2檔案系統inode
計算機如何管理好這些磁盤呢?答案是把磁盤磁區,磁區的頭部有一個啟動塊(Boot Block),,該磁區的其他區域會劃分成一個個塊組(Block Group),

那我們管理好一個塊組就可以了,其他的都是一樣的,每個塊組都有相同的結構組成:

Super Block:存放檔案系統本身的結構資訊,記錄的資訊主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入資料的時間,最近一次檢驗磁盤的時間等其他檔案系統的相關資訊,Super Block的資訊被破壞,可以說整個檔案系統結構就被破壞了,
Group Descriptor Table:塊組描述符,描述該磁區中塊組的屬性資訊
Block Bitmap:Block Bitmap中記錄著Data Block中哪個資料塊已經被占用,哪個資料塊沒有被占用
inode Bitmap每個bit表示一個inode是否空閑可用
inode Table:存放檔案屬性 如 檔案大小,所有者,最近修改時間等
Data blocks:存放檔案內容
創建檔案的程序
把上面的圖簡化一下:
1.存盤資訊:
內核先找空閑的磁區,塊組,在分配inode,通過i節點表找到空閑的i結點(上面的檔案是1845087),內核把檔案資訊記錄到其中,
2.存盤資料:
通過block bitmap找到空閑的塊組,假如是300,500,900三個
3.將檔案的內容分別存到data blocks中
4. 添加檔案名到目錄
新的檔案名y.txt,linux如何在當前的目錄中記錄這個檔案?內核將入口(1845087,y.txt)添加到目錄檔案,檔案名和inode之間的對應關系將檔案名和檔案的內容及屬性連接起來,
2.查找檔案
首先找到該檔案的磁區和塊組,接著找到檔案對應的inode編號,在inode table中拿到該檔案的屬性,在根據inode和data blocks的映射關系找到是哪個塊,在到data blocks拿到檔案的內容,這就是查找檔案,
3.理解洗掉檔案
洗掉檔案并不是洗掉資料,例如我們下載一個16G的游戲我們下載的時間比較長但是洗掉的時候便會很快,
洗掉檔案:找到檔案的對應block bimap和inode bitmap中的位置,此時直接把對應的有效位置改為無效,找不到映射關系即可,
軟硬鏈接
軟連接
建立軟連接命令:ln -s

我們用ll-ai查看一下,test和test.s的inode是不同的所以軟連接是一個獨立的檔案

我們沒刪掉test,test.s可以運行,但干掉test夠,檔案雖然在但是已經不能運行了,
硬鏈接
建立軟連接命令
ln:

我們看到硬鏈接的檔案的inode和檔案大小是一樣的,

干掉test,但test.h還是一樣可以運行的,

這里的鏈接數是硬鏈接,那為什么是2呢?

還有. 跟…,分別代表當前目錄和上級目錄,.和tmp的inode是一樣的,.tmp跟它的inode,…跟它的inode,所以鏈接數是2,
軟硬鏈接區別:
軟連接是單獨的檔案,硬鏈接和指向的檔案共享相同的inode,相當于重命名,硬鏈接反應了檔案名和inode的對應關系,
三個時間

Access 最后訪問時間
Modify 檔案內容最后修改時間
Change 屬性最后修改時間
動靜態庫
查看庫命令:ldd
來查看一下Linux默認使用的庫:

它使用的是動態庫,
在來使用靜態庫看看:
在makefile中加上-static


動態鏈接生成的可執行檔案比靜態鏈接的要小的多,
原理

動態庫:行程可以通過共享區,頁表映射到物理記憶體,而靜態庫是直接放在代碼區
動靜態庫區別:
動態庫優點:體積小,依賴庫,缺點:沒有庫則無法無運行
靜態庫優點:不依賴第三方庫,移植性強 ,缺點:體積大,浪費記憶體空間
靜態庫的打包和使用
為了更容易理解,創建4個檔案,add.c,add.h和sub.c, sub.h
add.h內容
1 #pragma onec
2
3 int add(int a,int b);
add.c
1 #include"add.h"
2
3 int add(int a, int b)
4 {
5 return a+b;
6 }
sub.h
1 #pragma once
2
3 int sub(int x, int y);
sub.c
1 #include"sub.h"
2
3 int sub(int x,int y)
4 {
5 return x - y;
6 }
打包
我們將剛剛的4個檔案先生成靜態庫
先讓源檔案生成對應的目標檔案

2.使用ar -rc生成靜態庫

成功生成靜態庫
可以用命令:
ar - tv查看靜態庫的內容

3.將頭檔案和靜態庫組織起來
我們把自己的庫給別人用,要給別人頭檔案和生成的庫,我們把所有的頭檔案放在include下,把庫放到mylib下,

我們還可以使用Makefile,非常的省事

一個make生成靜態庫

一個make output將頭檔案和靜態庫鏈接起來

使用
用main.c來測驗一下
1 #include<stdio.h>
2 #include"add.h"
3
4 int main()
5 {
6 int a = 30;
7 int b = 10;
8 printf("a+b=%d\n",a+b);
9 return 0;
10 }
此時使用gcc需要帶上3個選項
-I:指定頭檔案搜索路徑
-L:庫檔案搜索路徑
-l:指定鏈接哪個庫,(有許多庫的情況下)
我把其他檔案都干掉,只留下mylib,

可以成功運行,
動態庫的打包和使用
動態庫跟上面的靜態庫基本是一樣的步驟,只需要把Makefile改成動態鏈接,上面的add.c,add.h上面的博主在這里就不寫了,跟靜態庫的代碼是一樣的,
我們直接到打包,將靜態庫的Makefile修改一下:

一個make就生成庫

make output將頭檔案和庫組織起來

使用
使用和靜態庫也是一樣的,使用3選項
還是創建一個main.來測驗一下,我把其他的檔案都干掉只留庫mylib

成功運行了,和靜態庫的使用是一樣的,要多多練習,
本篇文章到這里就結束了,由于博主水平有限,如有錯誤,請直接練習博主,萬分感謝!!!
歡迎一起交流!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/390344.html
標籤:其他
上一篇:(Java)八大排序演算法總結

