linux系統(tǒng)下一切皆文件,通過虛擬文件系統(tǒng)(VFS)的機制將所有底層屏蔽掉,用戶可以通過統(tǒng)一的接口來實現(xiàn)對不同驅(qū)動的操作,對于每一個文件需要一個引用來指示,此時文件描述符應用而生,文件描述符類似于widows下的handle,對于文件的大部分操作都是通過這個描述符來操作的,例如read,write。對于每一個文件描述符,內(nèi)核使用三種數(shù)據(jù)結(jié)構(gòu)來管理。
(1) 每個進程在進程表中都有一個記錄項,每個記錄項中有一張打開文件描述符表,可將其視為一個矢量,每個描述符占用一項。與每個文件描述符相關聯(lián)的是:
(a) 文件描述符標志。 (當前只定義了一個文件描述符標志FD_CLOEXEC)
(b) 指向一個文件表項的指針。
(2) 內(nèi)核為所有打開文件維持一張文件表。每個文件表項包含:
(a) 文件狀態(tài)標志(讀、寫、增寫、同步、非阻塞等 )。
(b) 當前文件位移量。(即為lseek函數(shù)所操作的值)
(c) 指向該文件v節(jié)點表項的指針。
(3) 每個打開文件(或設備)都有一個 v 節(jié)點結(jié)構(gòu)。 v節(jié)點包含了文件類型和對此文件進行各種操作的函數(shù)的指針信息。對于大多數(shù)文件, v 節(jié)點還包含了該文件的 i 節(jié)點(索引節(jié)點)。這些信息是在打開文件時從盤上讀入內(nèi)存的,所以所有關于文件的信息都是快速可供使用的。例如, i 節(jié)點包含了文件的所有者、文件長度、文件所在的設備、指向文件在盤上所使用的實際數(shù)據(jù)塊的指針等等點。
經(jīng)過上述文件系統(tǒng)的三層封裝,每層負責不同的職責,從上到下第一層用于標識文件,第二層用于管理進程獨立數(shù)據(jù),第三層管理文件系統(tǒng)元數(shù)據(jù),直接關聯(lián)一個文件。這種分層思想的一個優(yōu)點就是上層可以復用下層的結(jié)構(gòu)??赡苡卸鄠€文件描述符項指向同一個文件表項,也可以有多個文件表項指向同一個V節(jié)點。
如果兩個獨立的進程打開了同一個文件,打開此文件的每個進程都得到一個文件表項,但是兩個文件表項的V節(jié)點指針指向相同的V節(jié)點,這樣的安排使得每個進程都有他自己的對該文件的當前位移量,且支持不同的打開方式(O_RDONLY, O_WRONLY, ORDWR)。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26