維基百科:
???????文件描述符在形式上是一個(gè)非負(fù)整數(shù)砌烁。實(shí)際上艘狭,它是一個(gè)索引值,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表霜医。當(dāng)程序打開一個(gè)現(xiàn)有文件或者創(chuàng)建一個(gè)新文件時(shí),內(nèi)核向進(jìn)程返回一個(gè)文件描述符。在程序設(shè)計(jì)中玛荞,一些涉及底層的程序編寫往往會(huì)圍繞著文件描述符展開。
作用:可以用在FileInputStream的構(gòu)造參數(shù)上
文件描述符:
???????文件描述符就是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引呕寝,用來指向被打開的文件勋眯,所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都會(huì)通過文件描述符婴梧。程序剛剛啟動(dòng)的時(shí)候,0是標(biāo)準(zhǔn)輸入客蹋,1是標(biāo)準(zhǔn)輸出塞蹭,2是標(biāo)準(zhǔn)錯(cuò)誤。如果此時(shí)去打開一個(gè)新的文件讶坯,它的文件描述符會(huì)是3番电。POSIX標(biāo)準(zhǔn)要求每次打開文件時(shí)(含socket)必須使用當(dāng)前進(jìn)程中最小可用的文件描述符號(hào)碼,因此辆琅,在網(wǎng)絡(luò)通信過程中稍不注意就有可能造成串話漱办。標(biāo)準(zhǔn)文件描述符圖如下:
???????文件描述與打開的文件對(duì)應(yīng)模型如下圖:
???????系統(tǒng)為了維護(hù)打開的文件,會(huì)維護(hù)三個(gè)表婉烟,分別是:
進(jìn)程級(jí)的文件描述符表
系統(tǒng)級(jí)的文件描述符表
文件系統(tǒng)的i-node表 (轉(zhuǎn)到:阮一峰——理解inode)
???????進(jìn)程級(jí)的描述符表的每一條目記錄了單個(gè)文件描述符的相關(guān)信息娩井。
- 控制文件描述符操作的一組標(biāo)志。(目前似袁,此類標(biāo)志僅定義了一個(gè)洞辣,即close-on-exec標(biāo)志)
- 對(duì)打開文件句柄的引用
???????內(nèi)核對(duì)所有打開的文件的文件維護(hù)有一個(gè)系統(tǒng)級(jí)的描述符表格(open file description table)。有時(shí)昙衅,也稱之為打開文件表(open file table)扬霜,并將表格中各條目稱為打開文件句柄(open file handle)。一個(gè)打開文件句柄存儲(chǔ)了與一個(gè)打開文件相關(guān)的全部信息而涉,如下所示:
當(dāng)前文件偏移量(調(diào)用read()和write()時(shí)更新著瓶,或使用lseek()直接修改)
打開文件時(shí)所使用的狀態(tài)標(biāo)識(shí)(即,open()的flags參數(shù))
文件訪問模式(如調(diào)用open()時(shí)所設(shè)置的只讀模式啼县、只寫模式或讀寫模式)
與信號(hào)驅(qū)動(dòng)相關(guān)的設(shè)置
對(duì)該文件i-node對(duì)象的引用
文件類型(例如:常規(guī)文件材原、套接字或FIFO)和訪問權(quán)限
一個(gè)指針,指向該文件所持有的鎖列表
文件的各種屬性谭羔,包括文件大小以及與不同類型操作相關(guān)的時(shí)間戳
???????下圖展示了文件描述符华糖、打開的文件句柄以及i-node之間的關(guān)系,圖中瘟裸,兩個(gè)進(jìn)程擁有諸多打開的文件描述符客叉。
在進(jìn)程A中,文件描述符1和30都指向了同一個(gè)打開的文件句柄(標(biāo)號(hào)23)话告。這可能是通過調(diào)用dup()兼搏、dup2()、fcntl()或者對(duì)同一個(gè)文件多次調(diào)用了open()函數(shù)而形成的沙郭。
進(jìn)程A的文件描述符2和進(jìn)程B的文件描述符2都指向了同一個(gè)打開的文件句柄(標(biāo)號(hào)73)佛呻。這種情形可能是在調(diào)用fork()后出現(xiàn)的(即,進(jìn)程A病线、B是父子進(jìn)程關(guān)系)吓著,或者當(dāng)某進(jìn)程通過UNIX域套接字將一個(gè)打開的文件描述符傳遞給另一個(gè)進(jìn)程時(shí)鲤嫡,也會(huì)發(fā)生。再者是不同的進(jìn)程獨(dú)自去調(diào)用open函數(shù)打開了同一個(gè)文件绑莺,此時(shí)進(jìn)程內(nèi)部的描述符正好分配到與其他進(jìn)程打開該文件的描述符一樣暖眼。
此外,進(jìn)程A的描述符0和進(jìn)程B的描述符3分別指向不同的打開文件句柄纺裁,但這些句柄均指向i-node表的相同條目(1976)诫肠,換言之,指向同一個(gè)文件欺缘。發(fā)生這種情況是因?yàn)槊總€(gè)進(jìn)程各自對(duì)同一個(gè)文件發(fā)起了open()調(diào)用栋豫。同一個(gè)進(jìn)程兩次打開同一個(gè)文件,也會(huì)發(fā)生類似情況谚殊。
前人的思考丧鸯,我們的階梯,這部分參考自網(wǎng)絡(luò):鏈接
文件描述符限制
???????有資源的地方就有戰(zhàn)爭(zhēng)络凿,“文件描述符”也是一種資源骡送,系統(tǒng)中的每個(gè)進(jìn)程都需要有“文件描述符”才能進(jìn)行改變世界的宏圖霸業(yè)昂羡。世界需要秩序絮记,于是就有了“文件描述符限制”的規(guī)定。
如下表:
永久修改用戶級(jí)限制時(shí)有三種設(shè)置類型:
soft指的是當(dāng)前系統(tǒng)生效的設(shè)置值
hard指的是系統(tǒng)中所能設(shè)定的最大值
-指的是同時(shí)設(shè)置了 soft 和 hard 的值
命令講解:
檢查某個(gè)進(jìn)程的文件描述符相關(guān)內(nèi)容
步驟(以nginx為例虐先,*注意權(quán)限問題怨愤,此示例是在本地環(huán)境):
找到需要檢查的進(jìn)程id:
如圖,找到的進(jìn)程id為 1367
查看該進(jìn)程的限制:
如圖蛹批,在 Max open files 那一行撰洗,可以看到當(dāng)前設(shè)置中最大文件描述符的數(shù)量為1024
查看該進(jìn)程占用了多少個(gè)文件描述符:
如圖所示,使用了17個(gè)文件描述符
總結(jié)
???????實(shí)際應(yīng)用過程中腐芍,如果出現(xiàn)“Too many open files” , 可以通過增大進(jìn)程可用的文件描述符數(shù)量來解決差导,但往往故事不會(huì)這樣結(jié)束,很多時(shí)候猪勇,并不是因?yàn)檫M(jìn)程可用的文件描述符過少设褐,而是因?yàn)槌绦騜ug,打開了大量的文件連接(web連接也會(huì)占用文件描述符)而沒有釋放泣刹。程序申請(qǐng)的資源在用完后及時(shí)釋放助析,才是解決“Too many open files”的根本之道。
————————————————
版權(quán)聲明:本文為CSDN博主「cywosp」的原創(chuàng)文章椅您,遵循CC 4.0 BY-SA版權(quán)協(xié)議外冀,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。