1. 文件描述符(重點)
在Linux系統(tǒng)中一切皆可以看成是文件,文件又可分為:普通文件、目錄文件、鏈接文件和設(shè)備文件。文件描述符(file descriptor)是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引,其是一個非負(fù)整數(shù)(通常是小整數(shù)),用于指代被打開的文件,所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都通過文件描述符。程序剛剛啟動的時候,0是標(biāo)準(zhǔn)輸入,1是標(biāo)準(zhǔn)輸出,2是標(biāo)準(zhǔn)錯誤。如果此時去打開一個新的文件,它的文件描述符會是3。
1.1概念介紹
文件描述符的操作(如: open(),creat(),close(),read()))返回的是一個文件描述符,它是int類型的整數(shù),即fd,其本質(zhì)是文件描述符表中的下標(biāo),它起到一個索引的作用,進程通過PCB中的文件描述符表找到該fd所指向的文件指針filp。每個進程在PCB(Process Control Block)即進程控制塊中都保存著一份文件描述符表,文件描述符就是這個表的索引,文件描述表中每個表項都有一個指向已打開文件的指針; 已打開的文件在內(nèi)核中用file
結(jié)構(gòu)體表示,文件描述符表中的指針指向file
結(jié)構(gòu)體。每打開一個文件,fd默認(rèn)從最小的未被使用的下標(biāo)開始分配。文件描述符的缺點:不能移植到UNIX以外的系統(tǒng)上去,也不直觀。
下面畫張圖來表示它們之間的關(guān)系:
而每個文件中又主要包含以下這些信息:
1.2圖表解釋
在file
結(jié)構(gòu)體中維護File Status Flag(file
結(jié)構(gòu)體的成員f_flags
)和當(dāng)前讀寫位置(file
結(jié)構(gòu)體的成員f_pos
)。在上圖中,進程1和進程2都打開同一文件,但是對應(yīng)不同的file
結(jié)構(gòu)體,因此可以有不同的File Status Flag和讀寫位置。file
結(jié)構(gòu)體中比較重要的成員還有f_count
,表示引用計數(shù)(Reference Count),后面我們會講到,dup
、fork
等系統(tǒng)調(diào)用會導(dǎo)致多個文件描述符指向同一個file
結(jié)構(gòu)體,例如有fd1
和fd2
都引用同一個file
結(jié)構(gòu)體,那么它的引用計數(shù)就是2,當(dāng)close(fd1)
時并不會釋放file
結(jié)構(gòu)體,而只是把引用計數(shù)減到1,如果再
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式