Linux--初識文件系統fd

01. C/系統調用文件操作

C/系統調用文件操作


02. 文件系統(ext2)結構

在這里插入圖片描述

Linux ext2文件系統,上圖為磁盤文件系統圖(內核內存映像肯定有所不同),磁盤是典型的塊設備,硬盤分區被劃分為一個個的block。一個塊的大小(有1MB,2MB或4MB)是由格式化的時候確定的,并且不可以更改。而上圖中啟動塊引導快的大小是確定的。每個塊組都有著相同的結構組成。

超級塊和塊組描述符表 會在多個塊組中備份,以提高容錯能力。其余結構(數據塊位圖、inode 位圖、inode 表、數據塊)是每個塊組獨立管理的。

文件訪問:

  • 通過目錄數據塊找到文件名對應的inode
  • 從inode表中讀取inode號,在文件混合索引內找到獲取數據塊指針
  • 根據指針訪問文件內容

文件創建:

  • 在位示圖找到為o的inode分配并寫入inode表
  • 在文件數據塊找到空閑塊分配給它
  • 更新數據塊,并添加文件名和inode的映射關系

文件刪除:

  • 位示圖和數據塊位圖置0,并在目錄數據塊刪除此二元關系

2.1 文件物理結構

2.1.1 連續分配

文件存儲在物理上連續的磁盤塊上,通過始址和長度(磁盤所占塊數)定位。

特點:

  • 順序訪問高效:磁頭移動少,適合順序讀寫(如視頻流)。
  • 有外部碎片,擴展困難(文件動態增長與增刪)

2.1.2 鏈接分配

文件分散存儲在磁盤塊上,每塊包含指向下一塊的指針(鏈式結構)。鏈接分配有隱式鏈接和顯示鏈接(FAT)兩種

隱式鏈接特點:

  • 無外部碎片,能動態擴展(增刪)。
  • 指針占用塊空間,訪問第i塊必須從表頭遍歷鏈表

文件分配表(FAT):集中存儲塊鏈接關系,避免塊內指針開銷,但需將FAT常駐內存以提高性能。

2.1.3 索引分配

為每個文件創建索引塊,存儲其所有數據塊的地址。

特點:

  • 支持隨機訪問:直接通過索引定位任意塊。
  • 無外部碎片:靈活分配空間。

2.2 超級塊

存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block的信息被破壞,可以說整個文件系統結構就被破壞了

struct ext2_super_block {__le32  s_inodes_count;         /* 索引節點總數 */__le32  s_blocks_count;         /* 塊總數 */__le32  s_r_blocks_count;       /* 保留的塊數 */__le32  s_free_blocks_count;    /* 空閑塊計數器 */__le32  s_free_inodes_count;    /* 空閑索引節點計數器 */__le32  s_first_data_block;     /* 第一個數據塊的塊號,總是為1 */...__le32  s_first_meta_bg;        /* 第一個元塊組 */__u32   s_reserved[190];        /* 填充到塊的末尾 */
};

2.3 塊組描述符表

描述塊組屬性信息


2.4 位示圖

塊組中 Inode 的分配狀態(已用/空閑)

struct ext2_inode {__le16  i_mode;         /* 文件類型和訪問權限,查看S_ISREG()等函數 */__le16  i_uid;          /* 所有者 Uid 的低 16 位,擁有者id */// 文件長度,最高位沒使用,最大表示2GB文件,大于2GB文件再使用i_dir_acl字段__le32  i_size;         /* 大小(字節) */__le32  i_atime;        /* 訪問時間 */__le32  i_ctime;        /* 索引節點創建時間 */__le32  i_mtime;        /* 文件數據最后改變時間 */__le32  i_dtime;        /* 刪除時間 */__le16  i_gid;          /* 組 ID 的低 16 位,用戶組id */__le16  i_links_count;  /* 硬鏈接計數 */
...
};

在這里插入圖片描述


2.5 文件描述符fd

fd是操作系統中用于標識和訪問已打開文件或I/O資源的整數標識符。存放

  • 每個進程的 task_struct 包含一個 files_struct 結構,內部維護一個 fd 數組
  • file*fd_array[]中存放多個file*
  • 數組索引(下標)即為fd,數組內部元素指向內核中的file對象

file*fd_array[]中下標為012分別預留給stdinstdoutstderr,所以新分配的原則是選擇未使用最小的開始分配。使用close()即可釋放任意已分配的fd,進程結束未關閉的fd由內核自動回收。

在這里插入圖片描述


2.6 重定向

在這里插入圖片描述
在這里插入圖片描述

fgets是語言層面的讀取函數,其底層也是用了系統標準輸入接口。其中寫死了只能對0號文件描述符進行讀取操作。而現在上邊的代碼將0號文件描述符給了新的文件。故該程序將讀出log.txt文件中的內容。這里完成了輸入重定向。

系統調用實現重定向:

int dup2(int oldfd, int newfd);

oldfd:要被復制已打開的fd

newfd:新的描述符編號

返回值:成功返回 newfd,失敗返回 -1 并設置 errno
oldfd的值變為newfd旳值,效果等同于上面先將fd=1指向的stdout關閉,然后再將fd=1分配給新打開的文件。
dup2(fd,1)將原本向顯示器輸出的內容輸出到fd指向的文件中。

在這里插入圖片描述


2.7 inode

存儲文件或目錄的元數據(不包括文件名)

在這里插入圖片描述

注:

  • 在Unix文件系統中,每個文件必須對應一個inode結點,而 inode結點的總數量是有上限的。如:僅用8KB作為inode區,假設每個inode大小為64B,則該文件系統最多只能存儲8KB/64B=128個 inode結點,相應地,該系統最多只能支持128個文件。
  • 當一個進程通過open系統調用打開某個文件時,操作系統需要將該文件對應的 inode結點讀入主存。

2.8 數據塊

  • 作用:存儲文件的實際內容或目錄的結構信息。
  • 類型
    • 文件數據塊:存儲普通文件的實際內容(如文本、圖片等)。
    • 目錄數據塊:存儲該目錄下的條目(文件名 + Inode 號)。
    • 符號鏈接數據塊:若鏈接路徑較短,直接存儲在 Inode 中;較長時占用數據塊。
    • 特殊文件:如設備文件(/dev/sda)的元數據存儲在 Inode 中,無需數據塊。

文件數據塊:

當一個文件過大時,則需要多個塊儲存數據。

在這里插入圖片描述

目錄文件數據塊:

存放的是目錄下文件名和inode的二元映射關系。

在這里插入圖片描述


2.9 緩沖區

緩沖區的存在,能夠提高數據效率。一般c語言庫函數寫入文件采用的是全緩沖,而寫入顯示器是航緩存。

如果一塊數據多次分批寫入外存效率低開銷大,但是一次性寫入效率最高。

  • 全緩沖文件輸出,效率高但實時性差,緩沖區滿I/O
  • 行緩沖:**終端(C庫)**輸出,遇到 \n 或緩沖區滿時刷新。
  • 無緩沖:如 stderr,立即輸出。

緩沖區刷新:

  • 用戶強制刷新
  • 進程退出

例如有語句char *str="helloworld",首先將該字符串存放在FILE結構體內的C緩沖區,滿足條件后將數據刷新到內核緩沖區,在這個區域由OS維護和操作。

內核空間
用戶空間
標準庫函數
系統調用
緩沖區滿/flush
立即進入
內核頁緩存
磁盤控制器
標準庫緩沖區
應用程序
用戶直接緩沖區
物理磁盤

在這里插入圖片描述

首先關閉文件描述符為1open分配的log.txt文件的fd為1,后面printffprintf會對新打開的文件(fd=1)執行新操作,改變了刷新機制。但是close(fd)使得文件描述符被關閉,C緩沖區內容無法向OS文件內核緩沖區刷新,故不會將數據刷新到log.txt內。


03. 軟硬鏈接

二者區別:軟鏈接會創建新的inode,而硬連接不會。

硬鏈接

  • 在目錄條目中新增一個文件名,指向同一 inode。
  • inode 的 引用計數 會遞增(可通過 stat 命令查看)

在這里插入圖片描述

軟鏈接

  • 創建一個新的 inode 和文件,文件內容為目標路徑字符串。
  • 訪問軟鏈接時,內核會遞歸解析路徑。

在這里插入圖片描述


04. 動靜態庫

待寫…

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81972.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法中的數學:歐拉函數

1.相關定義 互質:a與b的最大公約數為1 歐拉函數:在1~n中,與n互質的數的個數就是歐拉函數的值 eg: n1時,歐拉函數的值為1,因為1和1是互質的 n2是,值為2,因為1和2都是互質的 積性函數&…

BaseDao指南

1. BaseDao類 import java.sql.*;/*** 通用的工具類 ,負責連接數據, 執行增刪改查的通用方法*/ public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立數據庫連接** return*/public Boolean getCon…

SpringBoot JAR 啟動原理

文章目錄 版本概述JAR 包結構MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 時序圖參考 版本 Java 17SpringBoot 3.2.4 概述 JAR 啟動原理可以簡單理解為“java -jar的啟動原理” SpringBo…

YOLO11解決方案之速度估算探索

概述 Ultralytics提供了一系列的解決方案,利用YOLO11解決現實世界的問題,包括物體計數、模糊處理、熱力圖、安防系統、速度估計、物體追蹤等多個方面的應用。 YOLO速度估算結合物體檢測和跟蹤技術,使用YOLO11 模型檢測每幀中的物體&#xf…

初識C++:模版

本篇博客主要講解C模版的相關內容。 目錄 1.泛型編程 2.函數模板 2.1 函數模版概念 2.2 函數模版格式 2.3 函數模版的原理 2.4 函數模版的實例化 1.隱式實例化&#xff1a;讓編譯器根據實參推演模板參數的實際類型 2. 顯式實例化&#xff1a;在函數名后的<>中指定模…

人工智能100問?第27問:神經網絡與貝葉斯網絡的關系?

神經網絡與貝葉斯網絡是兩種互補的智能模型:神經網絡通過多層非線性變換從數據中學習復雜模式,擅長大規模特征提取和預測,而貝葉斯網絡基于概率推理建模變量間的條件依賴關系,擅長處理不確定性和因果推斷。兩者的融合(如貝葉斯神經網絡)結合了深度學習的表征能力與概率建…

【node.js】入門基礎

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. Node.js簡介1.1 Node.js的核心特點1.2 Node.js適用場景 2. 第一個Node.js程序2.1 創建并運行Hello World2.2 創建簡單的HTTP服務器 3. Node.js核心概念3.1 模塊系統3.1.1 創建和導出模塊3.1.2 導入和使用模…

百度飛槳PaddleOCR 3.0開源發布 OCR精度躍升13%

百度飛槳 PaddleOCR 3.0 開源發布 2025 年 5 月 20 日&#xff0c;百度飛槳團隊正式發布了 PaddleOCR 3.0 版本&#xff0c;并將其開源。這一新版本在文字識別精度、多語種支持、手寫體識別以及高精度文檔解析等方面取得了顯著進展&#xff0c;進一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL開發實戰指南(AIDL版)

Android 14 Binderized HAL開發實戰指南&#xff08;AIDL版&#xff09; 環境要求 Android 14源碼編譯環境AOSP android-14.0.0_r7分支Soong build系統Java 17 & NDK r25c 項目結構 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 創造美好的代價是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是歡樂。 時間是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能從容面對…

交安安全員:交通工程安全領域的關鍵角色

在交通工程這個龐大而復雜的領域中&#xff0c;交安安全員扮演著舉足輕重的角色&#xff0c;他們是安全的捍衛者&#xff0c;是交通工程順利推進的重要保障。? 交安安全員&#xff0c;專門從事公路水運工程施工企業安全生產管理工作。他們的專業身份由交通運輸部門頒發的交安…

實驗-設計一個應用系統(計算機組成原理)

目錄 一. 實驗內容 二. 實驗步驟 &#xff08;1&#xff09;七段數碼管顯示模塊 &#xff08;2&#xff09;指令模塊 &#xff08;3&#xff09;控制模塊 &#xff08;4&#xff09;ALU模塊 &#xff08;5&#xff09;CPU模塊 三. 實現效果 四. 實驗環境 五. 實驗小結…

【博客系統】博客系統第四彈:令牌技術

令牌機制 為什么不能使用 Session 實現登錄功能&#xff1f; 傳統思路&#xff1a; 登錄頁面把用戶名密碼提交給服務器。服務器端驗證用戶名密碼是否正確&#xff0c;并返回校驗結果給前端。如果密碼正確&#xff0c;則在服務器端創建 Session。通過 Cookie 把 sessionId 返回…

【瑞數3代】藥監評審中心逆向分析 | 后綴MmEwMD參數

1.目標 目標網址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫話機器學習系列】274.基尼指數(Gini Index)

決策樹中的基尼指數&#xff08;Gini Index&#xff09;詳解 —— 從公式理解到實際應用 在構建決策樹模型時&#xff0c;一個核心問題是&#xff1a;如何選擇最優的特征來進行節點劃分&#xff1f; 這就涉及到了“劃分準則”的問題。常見的準則有信息增益、信息增益率以及本文…

R語言學習--Day07--T分布與T檢驗

昨天我們介紹了R中用于對數據進行分類的聚類分析的方法&#xff0c;接下來我們來看T分布。 T分布 T分布適用于幫我們估計整組數據&#xff08;較小的數據量&#xff0c;一般小于30&#xff09;的真實值在哪一個區間&#xff0c;具體是計算置信區間&#xff08;一般為95%&#…

數據結構與算法-線性表-雙向鏈表(Double Linked List)

1 線性表 1.4 雙向鏈表&#xff08;Double Linked List&#xff09; 雙向鏈表的結點中有兩個指針域&#xff0c;一個指向直接后繼&#xff0c;另一個指向直接前驅&#xff0c;主要是為了解決前向查找的問題。 雙向鏈表結構&#xff1a; 書籍和視頻教程都只講解了插入和刪除的…

甘特圖實例 dhtmlxGantt.js

本文介紹了如何使用dhtmlxGantt庫創建一個基礎的甘特圖示例&#xff0c;并對其進行漢化和自定義配置。首先&#xff0c;通過引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特圖。接著&#xff0c;通過設置gantt.i18n.setLocale("cn")實現核心文本的漢化&#xff0…

C++23 新增扁平化關聯容器詳解

文章目錄 一、引言已有關聯容器回顧新容器的引入原因 二、std::flat_set定義與特性代碼示例適用場景 三、std::flat_multiset定義與特性代碼示例適用場景 四、std::flat_map定義與特性代碼示例適用場景 五、std::flat_multimap定義與特性代碼示例適用場景 六、與其他容器的比較…

使用zap,對web應用/API接口 做安全檢測

https://www.zaproxy.org/getting-started/ 檢測方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 執行baseline測試 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 執行api測試 docker run -t ghcr.io/zaproxy/zaproxy…