1. 文件描述符(重點(diǎn))
在Linux系統(tǒng)中一切皆可以看成是文件,文件又可分為:普通文件、目錄文件、鏈接文件和設(shè)備文件。文件描述符(file descriptor)是內(nèi)核為了高效管理已被打開(kāi)的文件所創(chuàng)建的索引,其是一個(gè)非負(fù)整數(shù)(通常是小整數(shù)),用于指代被打開(kāi)的文件,所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都通過(guò)文件描述符。程序剛剛啟動(dòng)的時(shí)候,0是標(biāo)準(zhǔn)輸入,1是標(biāo)準(zhǔn)輸出,2是標(biāo)準(zhǔn)錯(cuò)誤。如果此時(shí)去打開(kāi)一個(gè)新的文件,它的文件描述符會(huì)是3。
1.1概念介紹
文件描述符的操作(如: open(),creat(),close(),read()))返回的是一個(gè)文件描述符,它是int類型的整數(shù),即fd,其本質(zhì)是文件描述符表中的下標(biāo),它起到一個(gè)索引的作用,進(jìn)程通過(guò)PCB中的文件描述符表找到該fd所指向的文件指針filp。每個(gè)進(jìn)程在PCB(Process Control Block)即進(jìn)程控制塊中都保存著一份文件描述符表,文件描述符就是這個(gè)表的索引,文件描述表中每個(gè)表項(xiàng)都有一個(gè)指向已打開(kāi)文件的指針; 已打開(kāi)的文件在內(nèi)核中用file
結(jié)構(gòu)體表示,文件描述符表中的指針指向file
結(jié)構(gòu)體。每打開(kāi)一個(gè)文件,fd默認(rèn)從最小的未被使用的下標(biāo)開(kāi)始分配。文件描述符的缺點(diǎn):不能移植到UNIX以外的系統(tǒng)上去,也不直觀。
下面畫(huà)張圖來(lái)表示它們之間的關(guān)系:
而每個(gè)文件中又主要包含以下這些信息:
1.2圖表解釋
在file
結(jié)構(gòu)體中維護(hù)File Status Flag(file
結(jié)構(gòu)體的成員f_flags
)和當(dāng)前讀寫(xiě)位置(file
結(jié)構(gòu)體的成員f_pos
)。在上圖中,進(jìn)程1和進(jìn)程2都打開(kāi)同一文件,但是對(duì)應(yīng)不同的file
結(jié)構(gòu)體,因此可以有不同的File Status Flag和讀寫(xiě)位置。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,如果再
網(wǎng)友評(píng)論