文件描述符(File Descriptor)簡(jiǎn)介

維基百科:

???????文件描述符在形式上是一個(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)文件描述符圖如下:

image

???????文件描述與打開的文件對(duì)應(yīng)模型如下圖:

image

???????系統(tǒng)為了維護(hù)打開的文件,會(huì)維護(hù)三個(gè)表婉烟,分別是:

  1. 進(jìn)程級(jí)的文件描述符表

  2. 系統(tǒng)級(jí)的文件描述符表

  3. 文件系統(tǒng)的i-node表 (轉(zhuǎn)到:阮一峰——理解inode)

???????進(jìn)程級(jí)的描述符表的每一條目記錄了單個(gè)文件描述符的相關(guān)信息娩井。

  1. 控制文件描述符操作的一組標(biāo)志。(目前似袁,此類標(biāo)志僅定義了一個(gè)洞辣,即close-on-exec標(biāo)志)
  2. 對(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)的全部信息而涉,如下所示:

  1. 當(dāng)前文件偏移量(調(diào)用read()和write()時(shí)更新著瓶,或使用lseek()直接修改)

  2. 打開文件時(shí)所使用的狀態(tài)標(biāo)識(shí)(即,open()的flags參數(shù))

  3. 文件訪問模式(如調(diào)用open()時(shí)所設(shè)置的只讀模式啼县、只寫模式或讀寫模式)

  4. 與信號(hào)驅(qū)動(dòng)相關(guān)的設(shè)置

  5. 對(duì)該文件i-node對(duì)象的引用

  6. 文件類型(例如:常規(guī)文件材原、套接字或FIFO)和訪問權(quán)限

  7. 一個(gè)指針,指向該文件所持有的鎖列表

  8. 文件的各種屬性谭羔,包括文件大小以及與不同類型操作相關(guān)的時(shí)間戳

???????下圖展示了文件描述符华糖、打開的文件句柄以及i-node之間的關(guān)系,圖中瘟裸,兩個(gè)進(jìn)程擁有諸多打開的文件描述符客叉。

image
  • 在進(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ī)定。

如下表:

image

永久修改用戶級(jí)限制時(shí)有三種設(shè)置類型:

soft指的是當(dāng)前系統(tǒng)生效的設(shè)置值

hard指的是系統(tǒng)中所能設(shè)定的最大值

-指的是同時(shí)設(shè)置了 soft 和 hard 的值

命令講解:

ulimit

sysctl

檢查某個(gè)進(jìn)程的文件描述符相關(guān)內(nèi)容

步驟(以nginx為例虐先,*注意權(quán)限問題怨愤,此示例是在本地環(huán)境):

找到需要檢查的進(jìn)程id:

image

如圖,找到的進(jìn)程id為 1367

查看該進(jìn)程的限制:

image

如圖蛹批,在 Max open files 那一行撰洗,可以看到當(dāng)前設(shè)置中最大文件描述符的數(shù)量為1024

查看該進(jìn)程占用了多少個(gè)文件描述符:

image

如圖所示,使用了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)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/cywosp/article/details/38965239

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掀泳,一起剝皮案震驚了整個(gè)濱河市雪隧,隨后出現(xiàn)的幾起案子西轩,更是在濱河造成了極大的恐慌,老刑警劉巖脑沿,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遭商,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捅伤,警方通過查閱死者的電腦和手機(jī)劫流,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丛忆,“玉大人祠汇,你說我怎么就攤上這事∠ü睿” “怎么了可很?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凰浮。 經(jīng)常有香客問我我抠,道長(zhǎng),這世上最難降的妖魔是什么袜茧? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任菜拓,我火速辦了婚禮,結(jié)果婚禮上笛厦,老公的妹妹穿的比我還像新娘纳鼎。我一直安慰自己,他們只是感情好裳凸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布贱鄙。 她就那樣靜靜地躺著,像睡著了一般姨谷。 火紅的嫁衣襯著肌膚如雪逗宁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天梦湘,我揣著相機(jī)與錄音瞎颗,去河邊找鬼。 笑死践叠,一個(gè)胖子當(dāng)著我的面吹牛言缤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禁灼,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼管挟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了弄捕?” 一聲冷哼從身側(cè)響起僻孝,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤导帝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后穿铆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您单,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年荞雏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虐秦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凤优,死狀恐怖悦陋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筑辨,我是刑警寧澤俺驶,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站棍辕,受9級(jí)特大地震影響暮现,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楚昭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一栖袋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哪替,春花似錦栋荸、人聲如沸菇怀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爱沟。三九已至帅霜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呼伸,已是汗流浹背身冀。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留括享,地道東北人搂根。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铃辖,于是被迫代替她去往敵國(guó)和親剩愧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一些概念: 1.為了便于統(tǒng)一管理娇斩,系統(tǒng)將所有的輸入/輸出設(shè)備都視為文件仁卷,按文件方式提供給用戶使用穴翩,如目錄的檢索、權(quán)...
    yydounai閱讀 1,023評(píng)論 0 4
  • 故事背景 看在分布式架構(gòu)的通信過程中锦积,接觸到了netty芒帕,又通過netty接觸到了句柄和文件描述符,其實(shí)之前就有過...
    陽(yáng)光丶不銹閱讀 9,030評(píng)論 0 11
  • 與linux打交道丰介,盡管可能你只是一個(gè)高級(jí)語(yǔ)言的碼農(nóng)背蟆,還是或多或少的要和遇到d這種術(shù)語(yǔ)。今天抽空看了下傳說中的fd...
    sheen口開河閱讀 3,578評(píng)論 0 7
  • 一哮幢、文件描述符 1.1 概念 Linux 系統(tǒng)中淆储,把一切都看做是文件,當(dāng)進(jìn)程打開現(xiàn)有文件或創(chuàng)建新文件時(shí)家浇,內(nèi)核向進(jìn)...
    youzhihua閱讀 3,741評(píng)論 0 4
  • 每一個(gè)文件描述符會(huì)與一個(gè)打開文件相對(duì)應(yīng)本砰,同時(shí),不同的文件描述符也會(huì)指向同一個(gè)文件钢悲。相同的文件可以被不同的進(jìn)程打開也...
    JensenWong閱讀 1,704評(píng)論 0 0