欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

歡迎來到云服務(wù)器

系統(tǒng)配置

關(guān)于Linux文件描述符fd和文件指針flip的深入解析

簡(jiǎn)單歸納:fd只是一個(gè)整數(shù),在open時(shí)產(chǎn)生。起到一個(gè)索引的作用,進(jìn)程通過PCB中的文件描述符表找到該fd所指向的文件指針filp。

文件描述符的操作(如: open)返回的是一個(gè)文件描述符,內(nèi)核會(huì)在每個(gè)進(jìn)程空間中維護(hù)一個(gè)文件描述符表, 所有打開的文件都將通過此表中的文件描述符來引用;
而流(如: fopen)返回的是一個(gè)FILE結(jié)構(gòu)指針, FILE結(jié)構(gòu)是包含有文件描述符的,F(xiàn)ILE結(jié)構(gòu)函數(shù)可以看作是對(duì)fd直接操作的系統(tǒng)調(diào)用的封裝, 它的優(yōu)點(diǎn)是帶有I/O緩存

Linux支持各種各樣的文件系統(tǒng)格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660等等,不同的磁盤分區(qū)、光盤或其它存儲(chǔ)設(shè)備都有不同的文件系統(tǒng)格式,然而這些文件系統(tǒng)都可以mount到某個(gè)目錄下,使我們看到一個(gè)統(tǒng)一的目錄樹,各種文件系統(tǒng)上的目錄和文件我們用ls命令看起來是一樣的,讀寫操作用起來也都是一樣的,這是怎么做到的呢?Linux內(nèi)核在各種不同的文件系統(tǒng)格式之上做了一個(gè)抽象層,使得文件、目錄、讀寫訪問等概念成為抽象層的概念,因此各種文件系統(tǒng)看起來用起來都一樣,這個(gè)抽象層稱為虛擬文件系統(tǒng)(VFS,Virtual Filesystem)。上一節(jié)我們介紹了一種典型的文件系統(tǒng)在磁盤上的存儲(chǔ)布局,這一節(jié)我們介紹運(yùn)行時(shí)文件系統(tǒng)在內(nèi)核中的表示。

3.1. 內(nèi)核數(shù)據(jù)結(jié)構(gòu)

Linux內(nèi)核的VFS子系統(tǒng)可以圖示如下:

關(guān)于Linux文件描述符fd和文件指針flip的深入解析

每個(gè)進(jìn)程在PCB(Process Control Block)即進(jìn)程控制塊中都保存著一份文件描述符表,文件描述符就是這個(gè)表的索引,文件描述表中每個(gè)表項(xiàng)都有一個(gè)指向已打開文件的指針,現(xiàn)在我們明確一下:已打開的文件在內(nèi)核中用file結(jié)構(gòu)體表示,文件描述符表中的指針指向file結(jié)構(gòu)體。

在file結(jié)構(gòu)體中維護(hù)File Status Flag(file結(jié)構(gòu)體的成員f_flags)和當(dāng)前讀寫位置(file結(jié)構(gòu)體的成員f_pos)。在上圖中,進(jìn)程1和進(jìn)程2都打開同一文件,但是對(duì)應(yīng)不同的file結(jié)構(gòu)體,因此可以有不同的File Status Flag和讀寫位置。file結(jié)構(gòu)體中比較重要的成員還有f_count,表示引用計(jì)數(shù)(Reference Count),后面我們會(huì)講到,dup、fork等系統(tǒng)調(diào)用會(huì)導(dǎo)致多個(gè)文件描述符指向同一個(gè)file結(jié)構(gòu)體,例如有fd1和fd2都引用同一個(gè)file結(jié)構(gòu)體,那么它的引用計(jì)數(shù)就是2,當(dāng)close(fd1)時(shí)并不會(huì)釋放file結(jié)構(gòu)體,而只是把引用計(jì)數(shù)減到1,如果再close(fd2),引用計(jì)數(shù)就會(huì)減到0同時(shí)釋放file結(jié)構(gòu)體,這才真的關(guān)閉了文件。

每個(gè)file結(jié)構(gòu)體都指向一個(gè)file_operations結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體的成員都是函數(shù)指針,指向?qū)崿F(xiàn)各種文件操作的內(nèi)核函數(shù)。比如在用戶程序中read一個(gè)文件描述符,read通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核,然后找到這個(gè)文件描述符所指向的file結(jié)構(gòu)體,找到file結(jié)構(gòu)體所指向的file_operations結(jié)構(gòu)體,調(diào)用它的read成員所指向的內(nèi)核函數(shù)以完成用戶請(qǐng)求。在用戶程序中調(diào)用lseek、read、write、ioctl、open等函數(shù),最終都由內(nèi)核調(diào)用file_operations的各成員所指向的內(nèi)核函數(shù)完成用戶請(qǐng)求。file_operations結(jié)構(gòu)體中的release成員用于完成用戶程序的close請(qǐng)求,之所以叫release而不叫close是因?yàn)樗灰欢ㄕ娴年P(guān)閉文件,而是減少引用計(jì)數(shù),只有引用計(jì)數(shù)減到0才關(guān)閉文件。對(duì)于同一個(gè)文件系統(tǒng)上打開的常規(guī)文件來說,read、write等文件操作的步驟和方法應(yīng)該是一樣的,調(diào)用的函數(shù)應(yīng)該是相同的,所以圖中的三個(gè)打開文件的file結(jié)構(gòu)體指向同一個(gè)file_operations結(jié)構(gòu)體。如果打開一個(gè)字符設(shè)備文件,那么它的read、write操作肯定和常規(guī)文件不一樣,不是讀寫磁盤的數(shù)據(jù)塊而是讀寫硬件設(shè)備,所以file結(jié)構(gòu)體應(yīng)該指向不同的file_operations結(jié)構(gòu)體,其中的各種文件操作函數(shù)由該設(shè)備的驅(qū)動(dòng)程序?qū)崿F(xiàn)。

每個(gè)file結(jié)構(gòu)體都有一個(gè)指向dentry結(jié)構(gòu)體的指針,“dentry”是directory entry(目錄項(xiàng))的縮寫。我們傳給open、stat等函數(shù)的參數(shù)的是一個(gè)路徑,例如/home/akaedu/a,需要根據(jù)路徑找到文件的inode。為了減少讀盤次數(shù),內(nèi)核緩存了目錄的樹狀結(jié)構(gòu),稱為dentry cache,其中每個(gè)節(jié)點(diǎn)是一個(gè)dentry結(jié)構(gòu)體,只要沿著路徑各部分的dentry搜索即可,從根目錄/找到home目錄,然后找到akaedu目錄,然后找到文件a。dentry cache只保存最近訪問過的目錄項(xiàng),如果要找的目錄項(xiàng)在cache中沒有,就要從磁盤讀到內(nèi)存中。

每個(gè)dentry結(jié)構(gòu)體都有一個(gè)指針指向inode結(jié)構(gòu)體。inode結(jié)構(gòu)體保存著從磁盤inode讀上來的信息。在上圖的例子中,有兩個(gè)dentry,分別表示/home/akaedu/a和/home/akaedu/b,它們都指向同一個(gè)inode,說明這兩個(gè)文件互為硬鏈接。inode結(jié)構(gòu)體中保存著從磁盤分區(qū)的inode讀上來信息,例如所有者、文件大小、文件類型和權(quán)限位等。每個(gè)inode結(jié)構(gòu)體都有一個(gè)指向inode_operations結(jié)構(gòu)體的指針,后者也是一組函數(shù)指針指向一些完成文件目錄操作的內(nèi)核函數(shù)。和file_operations不同,inode_operations所指向的不是針對(duì)某一個(gè)文件進(jìn)行操作的函數(shù),而是影響文件和目錄布局的函數(shù),例如添加刪除文件和目錄、跟蹤符號(hào)鏈接等等,屬于同一文件系統(tǒng)的各inode結(jié)構(gòu)體可以指向同一個(gè)inode_operations結(jié)構(gòu)體。

inode結(jié)構(gòu)體有一個(gè)指向super_block結(jié)構(gòu)體的指針。super_block結(jié)構(gòu)體保存著從磁盤分區(qū)的超級(jí)塊讀上來的信息,例如文件系統(tǒng)類型、塊大小等。super_block結(jié)構(gòu)體的s_root成員是一個(gè)指向dentry的指針,表示這個(gè)文件系統(tǒng)的根目錄被mount到哪里,在上圖的例子中這個(gè)分區(qū)被mount到/home目錄下。

file、dentry、inode、super_block這幾個(gè)結(jié)構(gòu)體組成了VFS的核心概念。對(duì)于ext2文件系統(tǒng)來說,在磁盤存儲(chǔ)布局上也有inode和超級(jí)塊的概念,所以很容易和VFS中的概念建立對(duì)應(yīng)關(guān)系。而另外一些文件系統(tǒng)格式來自非UNIX系統(tǒng)(例如Windows的FAT32、NTFS),可能沒有inode或超級(jí)塊這樣的概念,但為了能mount到Linux系統(tǒng),也只好在驅(qū)動(dòng)程序中硬湊一下,在Linux下看FAT32和NTFS分區(qū)會(huì)發(fā)現(xiàn)權(quán)限位是錯(cuò)的,所有文件都是rwxrwxrwx,因?yàn)樗鼈儽緛砭蜎]有inode和權(quán)限位的概念,這是硬湊出來的。

騰訊云代理

Copyright © 2003-2021 MFISP.COM. 國(guó)外vps服務(wù)器租用 夢(mèng)飛云服務(wù)器租用 版權(quán)所有 ? 粵ICP備11019662號(hào)

主站蜘蛛池模板: 泾源县| 双江| 呼伦贝尔市| 民丰县| 寿光市| 合江县| 达孜县| 翁源县| 桓台县| 天台县| 天水市| 邛崃市| 商丘市| 马公市| 平昌县| 榆社县| 阿坝县| 公主岭市| 高雄县| 资阳市| 周至县| 通辽市| 平乐县| 汉中市| 巴东县| 鲁甸县| 隆尧县| 抚远县| 临海市| 胶南市| 政和县| 珲春市| 泉州市| 阜宁县| 宝坻区| 景泰县| 颍上县| 霍州市| 扎囊县| 泰州市| 葵青区|