文件描述符的本質(zhì)

文件描述符的本質(zhì)

文件描述符本質(zhì)

2161

1. 文件描述符的本質(zhì)是數(shù)組元素的下標(biāo)

右側(cè)的表稱為i節(jié)點(diǎn)表,在整個(gè)系統(tǒng)中只有1張吮播。該表可以視為結(jié)構(gòu)體數(shù)組王浴,該數(shù)組的一個(gè)元素對(duì)應(yīng)于一個(gè)物理文件姨伟。

中間的表稱為文件表,在整個(gè)系統(tǒng)中只有1張哮独。該表可以視為結(jié)構(gòu)體數(shù)組,一個(gè)結(jié)構(gòu)體中有很多字段察藐,其中有3個(gè)字段比較重要:

file status flags:用于記錄文件被打開來讀的皮璧,還是寫的。其實(shí)記錄的就是open調(diào)用中用戶指定的第2個(gè)參數(shù)

current file offset:用于記錄文件的當(dāng)前讀寫位置(指針)分飞。正是由于此字段的存在悴务,使得一個(gè)文件被打開并讀取后,下一次讀取將從上一次讀取的字符后開始讀取

v-node ptr:該字段是指針浸须,指向右側(cè)表的一個(gè)元素惨寿,從而關(guān)聯(lián)了物理文件。

左側(cè)的表稱為文件描述符表删窒,每個(gè)進(jìn)程有且僅有1張裂垦。該表可以視為指針數(shù)組,數(shù)組的元素指向文件表的一個(gè)元素肌索。最重要的是:數(shù)組元素的下標(biāo)就是大名鼎鼎的文件描述符蕉拢。

open系統(tǒng)調(diào)用執(zhí)行的操作:新建一個(gè)i節(jié)點(diǎn)表元素,讓其對(duì)應(yīng)打開的物理文件(如果對(duì)應(yīng)于該物理文件的i節(jié)點(diǎn)元素已經(jīng)建立,就不做任何操作)晕换;新建一個(gè)文件表的元素午乓,根據(jù)open的第2個(gè)參數(shù)設(shè)置file status flags字段,將current file offset字段置0闸准,將v-node ptr指向剛建立的i節(jié)點(diǎn)表元素益愈;在文件描述符表中,尋找1個(gè)尚未使用的元素夷家,在該元素中填入一個(gè)指針值蒸其,讓其指向剛建立的文件表元素。最重要的是:將該元素的下標(biāo)作為open的返回值返回库快。

這樣一來摸袁,當(dāng)調(diào)用read(write)時(shí),根據(jù)傳入的文件描述符义屏,OS就可以找到對(duì)應(yīng)的文件描述符表元素靠汁,進(jìn)而找到文件表的元素,進(jìn)而找到i節(jié)點(diǎn)表元素闽铐,從而完成對(duì)物理文件的讀寫蝶怔。

2. fork 對(duì)文件描述符的影響

fork會(huì)導(dǎo)致子進(jìn)程繼承父進(jìn)程打開的文件描述符,其本質(zhì)是將父進(jìn)程的整個(gè)文件描述符表復(fù)制一份阳啥,放到子進(jìn)程的PCB中添谊。因此父、子進(jìn)程中相同文件描述符(文件描述符為整數(shù))指向的是同一個(gè)文件表元素察迟,這將導(dǎo)致父(子)進(jìn)程讀取文件后斩狱,子(父)進(jìn)程將讀取同一文件的后續(xù)內(nèi)容。

案例分析(forkfd.c):

[c]view plaincopy

#include?

#include?

#include?

#include?

#include?

#include?

intmain(void)

{

intfd,?pid,?status;

charbuf[10];

if((fd?=?open("./test.txt",?O_RDONLY))?<?0)?{

perror("open");??exit(-1);

}

if((pid?=?fork())?<?0)?{

perror("fork");??exit(-1);

}elseif(pid?==?0)?{//child

read(fd,?buf,?2);

write(STDOUT_FILENO,?buf,?2);

}else{//parent

sleep(2);

lseek(fd,?SEEK_CUR,?1);

read(fd,?buf,?3);

write(STDOUT_FILENO,?buf,?3);

write(STDOUT_FILENO,"\n",?1);

}

return0;

}

假設(shè)扎瓶,./test.txt的內(nèi)容是abcdefg所踊。那么子進(jìn)程的18行將讀到字符ab;由于概荷,父秕岛、子進(jìn)程的文件描述符fd都指向同一個(gè)文件表元素,因此當(dāng)父進(jìn)程執(zhí)行23行時(shí)误证,fd對(duì)應(yīng)的文件的讀寫指針將移動(dòng)到字符d继薛,而不是字符b,從而24行讀到的是字符def愈捅,而不是字符bcd遏考。程序運(yùn)行的最終結(jié)果是打印abdef,而不是abbcd蓝谨。

相對(duì)應(yīng)的灌具,如果是兩個(gè)進(jìn)程獨(dú)立調(diào)用open去打開同一個(gè)物理文件青团,就會(huì)有2個(gè)文件表元素被創(chuàng)建,并且他們都指向同一個(gè)i節(jié)點(diǎn)表元素咖楣。兩個(gè)文件表元素都有自己獨(dú)立的current file offset字段督笆,這將導(dǎo)致2個(gè)進(jìn)程獨(dú)立的對(duì)同一個(gè)物理文件進(jìn)行讀寫,因此第1個(gè)進(jìn)程讀取到文件的第1個(gè)字符后诱贿,第2個(gè)進(jìn)程再去讀取該文件時(shí)娃肿,仍然是讀到的是文件的第1個(gè)字符,而不是第1個(gè)字符的后續(xù)字符珠十。

對(duì)應(yīng)用程序員而言咸作,最重要結(jié)論是: 如果子進(jìn)程不打算使用父進(jìn)程打開的文件,那么應(yīng)該在fork返回后立即調(diào)用close關(guān)閉該文件宵睦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墅诡,隨后出現(xiàn)的幾起案子壳嚎,更是在濱河造成了極大的恐慌,老刑警劉巖末早,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烟馅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡然磷,警方通過查閱死者的電腦和手機(jī)郑趁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姿搜,“玉大人寡润,你說我怎么就攤上這事【斯瘢” “怎么了梭纹?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)致份。 經(jīng)常有香客問我变抽,道長(zhǎng),這世上最難降的妖魔是什么氮块? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任绍载,我火速辦了婚禮,結(jié)果婚禮上滔蝉,老公的妹妹穿的比我還像新娘击儡。我一直安慰自己,他們只是感情好锰提,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布曙痘。 她就那樣靜靜地躺著芳悲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边坤。 梳的紋絲不亂的頭發(fā)上名扛,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音茧痒,去河邊找鬼肮韧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旺订,可吹牛的內(nèi)容都是我干的弄企。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼区拳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拘领!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起樱调,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤约素,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后笆凌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圣猎,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年乞而,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了送悔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爪模,死狀恐怖欠啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屋灌,我是刑警寧澤跪妥,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站声滥,受9級(jí)特大地震影響眉撵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜落塑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一纽疟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憾赁,春花似錦污朽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾睦。三九已至,卻和暖如春炎功,著一層夾襖步出監(jiān)牢的瞬間枚冗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蛇损, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赁温,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓淤齐,卻偏偏與公主長(zhǎng)得像股囊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子更啄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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

  • 內(nèi)核(kernel)利用文件描述符(file descriptor)來訪問文件稚疹。文件描述符是非負(fù)整數(shù)。打開現(xiàn)存文件...
    踩在浪花上00閱讀 750評(píng)論 0 1
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,004評(píng)論 6 13
  • 文件描述符 在Linux中祭务,進(jìn)程是通過文件描述符(file descriptors贫堰,簡(jiǎn)稱fd)而不是文件名來訪問文...
    德彪閱讀 3,580評(píng)論 0 4
  • 翻譯自 https://www.quantstart.com/topics/Quant-Careers原標(biāo)題:Qu...
    taoeaten閱讀 716評(píng)論 0 0
  • 一朵花 因亙古叢生于綠葉之中一展芬芳 一菩提 因千年等待的蹉跎歲月讓你沉迷 如果你尋覓 尋覓落英繽紛的深秋...
    亂世佳人beauty閱讀 238評(píng)論 0 0