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

歡迎來到云服務器

系統配置

關于Linux文件描寫符fd和文件指針flip的深入理會

簡樸歸納:fd只是一個整數,在open時發生。起到一個索引的浸染,歷程通過PCB中的文件描寫符表找到該fd所指向的文件指針filp。

文件描寫符的操縱(如: open)返回的是一個文件描寫符,內核會在每個歷程空間中維護一個文件描寫符表, 所有打開的文件都將通過此表中的文件描寫符來引用;
而流(如: fopen)返回的是一個FILE布局指針, FILE布局是包括有文件描寫符的,FILE布局函數可以看作是對fd直接操縱的系統挪用的封裝, 它的利益是帶有I/O緩存

Linux支持各類百般的文件系統名目,如ext2、ext3、reiserfs、FAT、NTFS、iso9660等等,差異的磁盤分區、光盤或其它存儲設備都有差異的文件系統名目,然而這些文件系統都可以mount到某個目次下,使我們看到一個統一的目次樹,各類文件系統上的目次和文件我們用ls呼吁看起來是一樣的,讀寫操縱用起來也都是一樣的,這是怎么做到的呢?Linux內核在各類差異的文件系統名目之上做了一個抽象層,使得文件、目次、讀寫會見等觀念成為抽象層的觀念,因此各類文件系統看起來用起來都一樣,這個抽象層稱為虛擬文件系統(VFS,Virtual Filesystem)。上一節我們先容了一種典范的文件系統在磁盤上的存儲機關,這一節我們先容運行時文件系統在內核中的暗示。

3.1. 內核數據布局

Linux內核的VFS子系統可以圖示如下:

關于Linux文件描寫符fd和文件指針flip的深入理會

每個歷程在PCB(Process Control Block)即歷程節制塊中都生存著一份文件描寫符表,文件描寫符就是這個表的索引,文件描寫表中每個表項都有一個指向已打開文件的指針,此刻我們明晰一下:已打開的文件在內核頂用file布局體暗示,文件描寫符表中的指針指向file布局體。

在file布局體中維護File Status Flag(file布局體的成員f_flags)和當前讀寫位置(file布局體的成員f_pos)。在上圖中,歷程1和歷程2都打開同一文件,可是對應差異的file布局體,因此可以有差異的File Status Flag和讀寫位置。file布局體中較量重要的成員尚有f_count,暗示引用計數(Reference Count),后頭我們會講到,dup、fork等系統挪用會導致多個文件描寫符指向同一個file布局體,譬喻有fd1和fd2都引用同一個file布局體,那么它的引用計數就是2,當close(fd1)時并不會釋放file布局體,而只是把引用計數減到1,假如再close(fd2),引用計數就會減到0同時釋放file布局體,這才真的封鎖了文件。

每個file布局體都指向一個file_operations布局體,這個布局體的成員都是函數指針,指向實現各類文件操縱的內核函數。好比在用戶措施中read一個文件描寫符,read通過系統挪用進入內核,然后找到這個文件描寫符所指向的file布局體,找到file布局體所指向的file_operations布局體,挪用它的read成員所指向的內核函數以完成用戶請求。在用戶措施中挪用lseek、read、write、ioctl、open等函數,最終都由內核挪用file_operations的各成員所指向的內核函數完成用戶請求。file_operations布局體中的release成員用于完成用戶措施的close請求,之所以叫release而不叫close是因為它不必然真的封鎖文件,而是淘汰引用計數,只有引用計數減到0才封鎖文件。對付同一個文件系統上打開的通例文件來說,read、write等文件操縱的步和諧要領應該是一樣的,挪用的函數應該是溝通的,所以圖中的三個打開文件的file布局體指向同一個file_operations布局體。假如打開一個字符設備文件,那么它的read、write操縱必定和通例文件紛歧樣,不是讀寫磁盤的數據塊而是讀寫硬件設備,所以file布局體應該指向差異的file_operations布局體,個中的各類文件操縱函數由該設備的驅動措施實現。

每個file布局體都有一個指向dentry布局體的指針,“dentry”是directory entry(目次項)的縮寫。我們傳給open、stat等函數的參數的是一個路徑,譬喻/home/akaedu/a,需要按照路徑找到文件的inode。為了淘汰讀盤次數,內核緩存了目次的樹狀布局,稱為dentry cache,個中每個節點是一個dentry布局體,只要沿著路徑各部門的dentry搜索即可,從根目次/找到home目次,然后找到akaedu目次,然后找到文件a。dentry cache只生存最近會見過的目次項,假如要找的目次項在cache中沒有,就要從磁盤讀到內存中。

每個dentry布局體都有一個指針指向inode布局體。inode布局體生存著從磁盤inode讀上來的信息。在上圖的例子中,有兩個dentry,別離暗示/home/akaedu/a和/home/akaedu/b,它們都指向同一個inode,說明這兩個文件互為硬鏈接。inode布局體中生存著從磁盤分區的inode讀上來信息,譬喻所有者、文件巨細、文件范例和權限位等。每個inode布局體都有一個指向inode_operations布局體的指針,后者也是一組函數指針指向一些完成文件目次操縱的內核函數。和file_operations差異,inode_operations所指向的不是針對某一個文件舉辦操縱的函數,而是影響文件和目次機關的函數,譬喻添加刪除文件和目次、跟蹤標記鏈接等等,屬于同一文件系統的各inode布局體可以指向同一個inode_operations布局體。

騰訊云代理

Copyright © 2003-2021 MFISP.COM. 國外vps服務器租用 夢飛云服務器租用 版權所有 ? 粵ICP備11019662號

主站蜘蛛池模板: 新竹县| 文安县| 阜新市| 石门县| 灌南县| 抚州市| 桐城市| 滕州市| 永安市| 樟树市| 清河县| 乌苏市| 五家渠市| 西青区| 罗江县| 九江市| 景谷| 留坝县| 永春县| 九龙坡区| 邵阳市| 高雄市| 邵武市| 常宁市| 观塘区| 进贤县| 平阴县| 亚东县| 城固县| 河西区| 堆龙德庆县| 溧水县| 应用必备| 新沂市| 军事| 邮箱| 凤山市| 新丰县| 金华市| 中宁县| 公安县|