linux系統(tǒng)下一切皆文件,通過(guò)虛擬文件系統(tǒng)(VFS)的機(jī)制將所有底層屏蔽掉,用戶可以通過(guò)統(tǒng)一的接口來(lái)實(shí)現(xiàn)對(duì)不同驅(qū)動(dòng)的操作,對(duì)于每一個(gè)文件需要一個(gè)引用來(lái)指示,此時(shí)文件描述符應(yīng)用而生,文件描述符類(lèi)似于widows下的handle,對(duì)于文件的大部分操作都是通過(guò)這個(gè)描述符來(lái)操作的,例如read,write。對(duì)于每一個(gè)文件描述符,內(nèi)核使用三種數(shù)據(jù)結(jié)構(gòu)來(lái)管理。

(1)  每個(gè)進(jìn)程在進(jìn)程表中都有一個(gè)記錄項(xiàng),每個(gè)記錄項(xiàng)中有一張打開(kāi)文件描述符表,可將其視為一個(gè)矢量,每個(gè)描述符占用一項(xiàng)。與每個(gè)文件描述符相關(guān)聯(lián)的是:

  (a)  文件描述符標(biāo)志。 (當(dāng)前只定義了一個(gè)文件描述符標(biāo)志FD_CLOEXEC)

  (b)  指向一個(gè)文件表項(xiàng)的指針。

(2)  內(nèi)核為所有打開(kāi)文件維持一張文件表。每個(gè)文件表項(xiàng)包含:

  (a)  文件狀態(tài)標(biāo)志(讀、寫(xiě)、增寫(xiě)、同步、非阻塞等 )。

  (b)  當(dāng)前文件位移量。(即為lseek函數(shù)所操作的值)

  (c)  指向該文件v節(jié)點(diǎn)表項(xiàng)的指針。

(3)  每個(gè)打開(kāi)文件(或設(shè)備)都有一個(gè) v 節(jié)點(diǎn)結(jié)構(gòu)。 v節(jié)點(diǎn)包含了文件類(lèi)型和對(duì)此文件進(jìn)行各種操作的函數(shù)的指針信息。對(duì)于大多數(shù)文件, v 節(jié)點(diǎn)還包含了該文件的 i 節(jié)點(diǎn)(索引節(jié)點(diǎn))。這些信息是在打開(kāi)文件時(shí)從盤(pán)上讀入內(nèi)存的,所以所有關(guān)于文件的信息都是快速可供使用的。例如, i 節(jié)點(diǎn)包含了文件的所有者、文件長(zhǎng)度、文件所在的設(shè)備、指向文件在盤(pán)上所使用的實(shí)際數(shù)據(jù)塊的指針等等點(diǎn)。

 photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  經(jīng)過(guò)上述文件系統(tǒng)的三層封裝,每層負(fù)責(zé)不同的職責(zé),從上到下第一層用于標(biāo)識(shí)文件,第二層用于管理進(jìn)程獨(dú)立數(shù)據(jù),第三層管理文件系統(tǒng)元數(shù)據(jù),直接關(guān)聯(lián)一個(gè)文件。這種分層思想的一個(gè)優(yōu)點(diǎn)就是上層可以復(fù)用下層的結(jié)構(gòu)。可能有多個(gè)文件描述符項(xiàng)指向同一個(gè)文件表項(xiàng),也可以有多個(gè)文件表項(xiàng)指向同一個(gè)V節(jié)點(diǎn)。

  如果兩個(gè)獨(dú)立的進(jìn)程打開(kāi)了同一個(gè)文件,打開(kāi)此文件的每個(gè)進(jìn)程都得到一個(gè)文件表項(xiàng),但是兩個(gè)文件表項(xiàng)的V節(jié)點(diǎn)指針指向相同的V節(jié)點(diǎn),這樣的安排使得每個(gè)進(jìn)程都有他自己的對(duì)該文件的當(dāng)前位移量,且支持不同的打開(kāi)方式(O_RDONLY, O_WRONLY, ORDWR)。

網(wǎng)友評(píng)論