久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 什么是文件描述符

什么是文件描述符(fu) 時(shi)間(jian):2018-09-25  ;    來源:未知(zhi)

Linux內核在各種不同的文(wen)(wen)件系(xi)統格式之上做了一個抽象(xiang)(xiang)層,使得文(wen)(wen)件、目錄、讀寫訪問等概念成(cheng)為抽象(xiang)(xiang)層的概念,因此各種文(wen)(wen)件系(xi)統看起來用(yong)起來都一樣(yang),這個抽象(xiang)(xiang)層稱為虛擬文(wen)(wen)件系(xi)統(VFS,Virtual Filesystem)。

內核數據結構

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

每個進(jin)程(cheng)在(zai)PCB(Process Control Block)中都保存著(zhu)一(yi)份文(wen)件描(miao)述符表(biao),文(wen)件描(miao)述符就是(shi)這個表(biao)的(de)索引,每個表(biao)項都有一(yi)個指向(xiang)已打(da)(da)開文(wen)件的(de)指針,現在(zai)我們明(ming)確一(yi)下:已打(da)(da)開的(de)文(wen)件在(zai)內(nei)核(he)中用file結構體表(biao)示(shi),文(wen)件描(miao)述符表(biao)中的(de)指針指向(xiang)file結構體。

在file結(jie)(jie)(jie)構(gou)(gou)體中維護File Status Flag(file結(jie)(jie)(jie)構(gou)(gou)體的(de)(de)成(cheng)員f_flags)和(he)當(dang)前讀(du)寫位(wei)(wei)置(file結(jie)(jie)(jie)構(gou)(gou)體的(de)(de)成(cheng)員f_pos)。在上圖中,進程1和(he)進程2都打開同(tong)一文件(jian),但(dan)是對應不(bu)同(tong)的(de)(de)file結(jie)(jie)(jie)構(gou)(gou)體,因此可(ke)以有不(bu)同(tong)的(de)(de)File Status Flag和(he)讀(du)寫位(wei)(wei)置。file結(jie)(jie)(jie)構(gou)(gou)體中比較重要的(de)(de)成(cheng)員還有f_count,表示引(yin)用(yong)計數(Reference Count),fork等系統調用(yong)會(hui)導致多個文件(jian)描(miao)述符指向(xiang)同(tong)一個file結(jie)(jie)(jie)構(gou)(gou)體,例如(ru)有fd1和(he)fd2都引(yin)用(yong)同(tong)一個file結(jie)(jie)(jie)構(gou)(gou)體,那么它的(de)(de)引(yin)用(yong)計數就(jiu)是2,當(dang)close(fd1)時并(bing)不(bu)會(hui)釋(shi)(shi)放file結(jie)(jie)(jie)構(gou)(gou)體,而只是把(ba)引(yin)用(yong)計數減到1,如(ru)果再(zai)close(fd2),引(yin)用(yong)計數就(jiu)會(hui)減到0同(tong)時釋(shi)(shi)放file結(jie)(jie)(jie)構(gou)(gou)體,這(zhe)才真的(de)(de)關閉了文件(jian)。

每個(ge)(ge)(ge)file結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)都指(zhi)(zhi)向(xiang)(xiang)一(yi)(yi)個(ge)(ge)(ge)file_operations結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti),這個(ge)(ge)(ge)結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)的(de)(de)成(cheng)員都是(shi)(shi)函(han)(han)數(shu)(shu)指(zhi)(zhi)針,指(zhi)(zhi)向(xiang)(xiang)實現各種(zhong)文(wen)件(jian)操作的(de)(de)內(nei)核(he)(he)(he)函(han)(han)數(shu)(shu)。比如(ru)在用(yong)(yong)(yong)(yong)戶(hu)(hu)程序(xu)中read一(yi)(yi)個(ge)(ge)(ge)文(wen)件(jian)描述符(fu),read通過系統(tong)調(diao)用(yong)(yong)(yong)(yong)進(jin)入內(nei)核(he)(he)(he),然后找(zhao)到(dao)(dao)這個(ge)(ge)(ge)文(wen)件(jian)描述符(fu)所(suo)指(zhi)(zhi)向(xiang)(xiang)的(de)(de)file結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti),找(zhao)到(dao)(dao)file結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)所(suo)指(zhi)(zhi)向(xiang)(xiang)的(de)(de)file_operations結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti),調(diao)用(yong)(yong)(yong)(yong)它(ta)(ta)的(de)(de)read成(cheng)員所(suo)指(zhi)(zhi)向(xiang)(xiang)的(de)(de)內(nei)核(he)(he)(he)函(han)(han)數(shu)(shu)以完(wan)(wan)成(cheng)用(yong)(yong)(yong)(yong)戶(hu)(hu)請(qing)求(qiu)。在用(yong)(yong)(yong)(yong)戶(hu)(hu)程序(xu)中調(diao)用(yong)(yong)(yong)(yong)lseek、read、write、ioctl、open等(deng)函(han)(han)數(shu)(shu),終(zhong)都由內(nei)核(he)(he)(he)調(diao)用(yong)(yong)(yong)(yong)file_operations的(de)(de)各成(cheng)員所(suo)指(zhi)(zhi)向(xiang)(xiang)的(de)(de)內(nei)核(he)(he)(he)函(han)(han)數(shu)(shu)完(wan)(wan)成(cheng)用(yong)(yong)(yong)(yong)戶(hu)(hu)請(qing)求(qiu)。file_operations結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)中的(de)(de)release成(cheng)員用(yong)(yong)(yong)(yong)于(yu)完(wan)(wan)成(cheng)用(yong)(yong)(yong)(yong)戶(hu)(hu)程序(xu)的(de)(de)close請(qing)求(qiu),之(zhi)所(suo)以叫(jiao)release而(er)不(bu)叫(jiao)close是(shi)(shi)因為(wei)它(ta)(ta)不(bu)一(yi)(yi)定(ding)真的(de)(de)關(guan)閉(bi)文(wen)件(jian),而(er)是(shi)(shi)減少引(yin)用(yong)(yong)(yong)(yong)計(ji)數(shu)(shu),只有引(yin)用(yong)(yong)(yong)(yong)計(ji)數(shu)(shu)減到(dao)(dao)0才(cai)關(guan)閉(bi)文(wen)件(jian)。對于(yu)同(tong)(tong)一(yi)(yi)個(ge)(ge)(ge)文(wen)件(jian)系統(tong)上打(da)開(kai)(kai)的(de)(de)常(chang)(chang)規(gui)文(wen)件(jian)來說,read、write等(deng)文(wen)件(jian)操作的(de)(de)步驟和(he)方法應該是(shi)(shi)一(yi)(yi)樣的(de)(de),調(diao)用(yong)(yong)(yong)(yong)的(de)(de)函(han)(han)數(shu)(shu)應該是(shi)(shi)相(xiang)同(tong)(tong)的(de)(de),所(suo)以圖中的(de)(de)三個(ge)(ge)(ge)打(da)開(kai)(kai)文(wen)件(jian)的(de)(de)file結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)指(zhi)(zhi)向(xiang)(xiang)同(tong)(tong)一(yi)(yi)個(ge)(ge)(ge)file_operations結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)。如(ru)果打(da)開(kai)(kai)一(yi)(yi)個(ge)(ge)(ge)字符(fu)設(she)備文(wen)件(jian),那么它(ta)(ta)的(de)(de)read、write操作肯定(ding)和(he)常(chang)(chang)規(gui)文(wen)件(jian)不(bu)一(yi)(yi)樣,不(bu)是(shi)(shi)讀寫(xie)磁盤的(de)(de)數(shu)(shu)據塊而(er)是(shi)(shi)讀寫(xie)硬件(jian)設(she)備,所(suo)以file結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti)應該指(zhi)(zhi)向(xiang)(xiang)不(bu)同(tong)(tong)的(de)(de)file_operations結(jie)(jie)構(gou)(gou)(gou)體(ti)(ti),其中的(de)(de)各種(zhong)文(wen)件(jian)操作函(han)(han)數(shu)(shu)由該設(she)備的(de)(de)驅動程序(xu)實現。

每個file結(jie)構體都有一個指向dentry(目(mu)錄(lu)項(xiang))結(jie)構體的指針,我們傳給(gei)open、stat等(deng)函數(shu)的參數(shu)是(shi)一個路徑(jing),例如/home/akaedu/a,需要(yao)根據(ju)路徑(jing)找(zhao)到文(wen)件的inode。為了減少讀盤次數(shu),內核緩存(cun)了目(mu)錄(lu)的樹狀結(jie)構,稱為dentry cache,其中(zhong)每個節(jie)點是(shi)一個dentry結(jie)構體,只(zhi)要(yao)沿著(zhu)路徑(jing)各部分的dentry搜索即可,從(cong)根目(mu)錄(lu)/找(zhao)到home目(mu)錄(lu),然后找(zhao)到akaedu目(mu)錄(lu),然后找(zhao)到文(wen)件a。dentry cache只(zhi)保存(cun)近(jin)訪問(wen)過的目(mu)錄(lu)項(xiang),如果要(yao)找(zhao)的目(mu)錄(lu)項(xiang)在cache中(zhong)沒有,就要(yao)從(cong)磁盤讀到內存(cun)中(zhong)。

每個(ge)dentry結(jie)(jie)(jie)(jie)構(gou)體都有(you)一(yi)個(ge)指(zhi)針指(zhi)向inode結(jie)(jie)(jie)(jie)構(gou)體。inode結(jie)(jie)(jie)(jie)構(gou)體中保存(cun)著從磁盤分(fen)區的(de)(de)inode讀上來信(xin)息,例(li)(li)如所有(you)者、inode節點、文(wen)(wen)件(jian)(jian)(jian)大(da)小、文(wen)(wen)件(jian)(jian)(jian)類(lei)型和(he)(he)權限位等。我們通過ln命令(ling)創建的(de)(de)硬鏈接就是(shi)使不(bu)同的(de)(de)dentry中的(de)(de)結(jie)(jie)(jie)(jie)構(gou)體指(zhi)針指(zhi)向同一(yi)個(ge)inode結(jie)(jie)(jie)(jie)構(gou)體而已。每個(ge)inode結(jie)(jie)(jie)(jie)構(gou)體都有(you)一(yi)個(ge)指(zhi)向inode_operations結(jie)(jie)(jie)(jie)構(gou)體的(de)(de)指(zhi)針,后者也是(shi)一(yi)組(zu)函(han)數(shu)(shu)指(zhi)針指(zhi)向一(yi)些完成文(wen)(wen)件(jian)(jian)(jian)目錄操作的(de)(de)內核(he)函(han)數(shu)(shu)。和(he)(he)file_operations不(bu)同,inode_operations所指(zhi)向的(de)(de)不(bu)是(shi)針對某一(yi)個(ge)文(wen)(wen)件(jian)(jian)(jian)進行操作的(de)(de)函(han)數(shu)(shu),而是(shi)影響(xiang)文(wen)(wen)件(jian)(jian)(jian)和(he)(he)目錄布局的(de)(de)函(han)數(shu)(shu),例(li)(li)如添加刪(shan)除(chu)文(wen)(wen)件(jian)(jian)(jian)和(he)(he)目錄、跟蹤符號鏈接等等,屬于同一(yi)文(wen)(wen)件(jian)(jian)(jian)系統(tong)的(de)(de)各inode結(jie)(jie)(jie)(jie)構(gou)體可以(yi)指(zhi)向同一(yi)個(ge)inode_operations結(jie)(jie)(jie)(jie)構(gou)體。

inode結(jie)構體(ti)(ti)有一個(ge)指(zhi)(zhi)向super_block結(jie)構體(ti)(ti)的(de)指(zhi)(zhi)針。super_block結(jie)構體(ti)(ti)保存(cun)著從磁盤分區的(de)超級塊讀上來(lai)的(de)信息,例如文(wen)件系(xi)統類型、塊大小等。

上一篇:OpenWrt之mips交叉編譯鏈配置

下一篇:大神修煉第一步

熱點文章推薦
華清學員就(jiu)業榜單
高薪(xin)學員經驗分享
熱點(dian)新聞(wen)推薦(jian)
前臺專(zhuan)線:010-82525158 企業(ye)培訓(xun)洽談(tan)專(zhuan)線:010-82525379 院校合作洽談專線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部