Welcome to Galaxy Software Services Corporation !
徵才專區
CSR專區
Vital CRM 國際認證
GSS部落格
叡揚資訊
關於叡揚
新聞與活動
產品與服務
叡揚e論壇
投資人關係
EN
中
簡
日
搜尋
關於叡揚
叡揚簡介
創辦人的話
叡揚大事紀
得獎肯定
合作夥伴
營業據點
聯絡我們
新聞與活動
新聞中心
資安電子報
影音專區
成功案例
行銷活動
產品與服務
企業e化應用軟體
S.P.E.E.D. 公文線上簽核管理系統
Radar 睿達人力資源管理系統
iota C.ai 對話服務平台
Tracko 多源智慧追蹤平台
B.E.S.T. 銀行信用風險資訊解決方案
BoDms 董事會提案暨會務管理系統
Vitals ESP 企業知識協作平台
Vitals HCA 評鑑協同管理系統
Vitals HAS 醫療數據分析系統
Vitals KPIM 指標管理系統
Openfind 網擎訊息安全解決方案
資訊安全
資訊安全系列產品
Checkmarx 源碼安全檢測
Digital.ai APP & Web 防護
Digital.ai APP & Web 相容性功能驗測
illumio 零信任微切分
Orca Security 雲端原生應用程式防護平台
Azul 安全高效 Java JDK
Mend.io Open Source 檢測
HCL 網頁應用程式弱點掃描軟體
Quokka APP 黑箱檢測
Secure Code Warrior 安全開發培訓平台
資安檢測服務
資安學程
資安白皮書
資安電子報
企業數位化智慧維運
企業數位化智慧維運
Axway API 管理平台
Axway ST 集中檔案傳輸管理
AVC 應用程式弱點整合平台
BMC Control-M 批次管理解決方案
BMC Helix Discovery & AISM 探索打造企業IT智慧管理平台
Dynatrace AI智慧維運與效能管理
DMP 數據治理平台
Noname Security 完整主動式API安全平台
Servicenow ITSM一站式IT服務管理平台
TIBCO 智能化資料平台
RPA 機器人流程自動化
Automation Anywhere 業務流程自動化RPA平台
UiPath 機器人流程自動化平台
Woodpecker XVR 次世代資安可視性解決方案
資源中心
雲端與大數據服務
Vital NetZero 零碳雲
Vital CRM 客戶關係管理
Vital BizForm 雲端智慧表單
Vital Knowledge 協同知識管理
Vital Finance 財務會計管理
Vital OD 雲端公文管理
Vital HCM 雲端人力資源管理
大數據分析解決方案
運帷服務
資訊系統維運與開發服務
QuEye CIA 軟體變更衝擊分析器
AI 解決方案
AI 解決方案介紹
AI 智慧公文解決方案
AI 財務報表辨識系統
政府共同供應契約
ESG解決方案
叡揚e論壇
叡揚e論壇
產品使用真心話
投資人關係
股東專區
重大訊息
主要股東
股東會
歷年股利
股利政策
法人說明會
聯繫窗口
公開資訊觀測站
公司治理
營運團隊
公司治理
董事會
功能性委員會
誠信經營
風險管理
智慧財產管理計畫
利害關係人與溝通
公司重要內規
CSR專區
財務資訊
每月營收資訊
財務報告
EN
中
簡
日
搜尋
徵才專區
CSR專區
Vital CRM 國際認證
GSS部落格
選單
首頁
分類
標籤
選擇分類
園丁來閒聊
工具平台
專案管理
資料庫
經驗分享
測試
設計
效能調校
程式語言
|_
.NET MVC
|_
.NET
|_
Java
|_
C#
|_
Python
|_
TypeScript
|_
VB.NET
園丁
資訊安全
開發工法
作業系統
前端
搜尋
訂閱文章
取消訂閱文章
設置
登入
帳號
密碼
記住我
登入
忘記帳號
重置密碼
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
4 分鐘閱讀時間
(748 個字)
字體大小:
+
–
訂閱
取消訂閱
Linux 檔案系統的資料結構
作業系統
2017/07/04, 週二
1348 點擊
0 評論
我們在開發應用系統或寫程式時, 大多會使用到檔案來存取資料, 雖然目前許多應用系統會直接連接資料庫, 但是資料庫也會使用檔案對資料做存取的動作, 因此檔案系統在大部份作業系統中都是一個重要的部分.
在 Linux 或其他 Unix-Based 的系統中, C 語言是最主要的語言. 在 C 語言中關於檔案的功能大部份都透過 Standard I/O Library 來完成 (也就是最常見的 printf 和 scanf 等 function). 在此我們要介紹的是更低階的檔案功能, 一般稱之為 File I/O, 這些功能都是直接作系統呼叫. 在 File I/O, 開啟檔案是使用 open 這個 function (在Standard I/O 是使用 fopen). 開檔成功後系統會傳回一個叫做 File Descriptor (FD) 的整數, 後續關於這個檔案的動作及功能都要使用這個 FD, 如檔案讀寫等, 都要傳入這個FD當做參數. FD 基本上是一個Index, 而 FD 也是檔案系統的資料結構中, 唯一使用者程式能夠看到的部份. 開啟檔案相關的資料結構如下圖所示. 需要注意的是圖中稱為 Table 的資料結構其實都不一定真正使用 Table 的形式.
在 Linux 中, 一個 Process 的相關資訊都會存放在一個 task_struct 的資料結構中 (定義於 include/linux/sched.h 中), 這個資料結構就是一般熟知的 Process Table 的組成元素. 在 task_struct 中, 有一個 Pointer 指向 files_struct 這個資料結構(定義於 include/linux/fdtable.h), 在 files_struct 中包含有圖中的 FD table, 這是由一個叫做 file 的資料結構的pointer 所構成的 Array (file 的結構定義於 include/linux/fs.h). 系統就是透過 FD 來找到圖中所示 File Table 中的 file 的pointer. 在 file 的資料結構中, 有一個變數 f_pos, 用來表示 current file offset, 也就是這個檔案下一次讀寫的啟始位置. 因此若有兩個 FD 指到相同的 file 結構, 他們將會共用相同的 file offset, 因此透過其中一個 FD 去對檔案做讀寫後, 再用另一個 FD 去讀寫檔案(可能是另一個 process) 會從新的位置開始. 在 file 結構的另一個變數 f_inode, 會指到 inode 的資料結構(inode的基本資訊定義於 include/linux/fs.h, 但是不同的檔案系統細部結構會有差異). 在Linux 以及 Unix中, 一個 inode 代表著一個檔案, inode 會存放所有關於這個檔案的完整資訊, 例如檔案的 owner 以及檔案存放在硬碟的位置等.
下面用檔案開啟的動作來簡略說明這些資料結構彼此之間的連結. 當要 open 一個檔案時, 所做的事情大致上是這樣的:
先檢查 open_flags, 這裏的 flags 主要是看看是否 Create新檔, 檔案是否共享等等 (fs/open.c)
透過 files_struct中的 fdtable (即圖中的 FD table), 選取一個空的 FD (fs/file.c)
產生一個 file 資料結構的物件並將之存到File table, 然後再把它 link 到相對應的 inode (namei.c)
取得 File table 的這個 file物件的 pointer, 並將這個 file pointer加到 FD array 中 (file.c ).
這樣就完成了開啟檔案的動作, 在後續對檔案的動作, 如 read, write 等, 就透過這個 FD 拿到檔案的所有資訊.
你覺得這篇文章怎麽樣?
開心
(
0
)
喜愛
(
0
)
驚奇
(
0
)
悲傷
(
0
)
生氣
(
0
)
標籤:
Linux
資料結構
Git Commit大小寫問題
透過 Jenkins 從 Gitlab 拉 Source 自動建置 Xamarin iOS Mobi...
相關文章
Linux 系統中 Docker 的設計與實作
作業系統
每日小知識#6 - 套件管理
工具平台
評論
尚無評論
已經注冊了?
這裡登入
Guest
2024/05/05, 週日
Captcha 圖像
提交您的評論