Linux操作系統(tǒng)進(jìn)程與文件的關(guān)系

本文重點(diǎn)介紹一下Linux操作系統(tǒng)進(jìn)程(線程)與文件描述符、文件的關(guān)系,具體到內(nèi)核部分就是task_struct、files_struct、file和inode的關(guān)系。

我們?cè)贚inux用戶態(tài)開發(fā)都清楚,打開一個(gè)文件之后會(huì)返回一個(gè)文件描述符,而且每個(gè)進(jìn)程打開文件的數(shù)量是有限的。這個(gè)具體是什么什么原因?

如果我們深入到Linux操作系統(tǒng)的內(nèi)核,就會(huì)知道其中的奧秘。在Linux操作系統(tǒng),每個(gè)用戶態(tài)的進(jìn)程在內(nèi)核態(tài)都有一個(gè)對(duì)應(yīng)的內(nèi)核進(jìn)程(線程),這個(gè)在內(nèi)核中通過task_struct結(jié)構(gòu)體標(biāo)識(shí),內(nèi)核通過其實(shí)現(xiàn)對(duì)進(jìn)程的調(diào)度。而在內(nèi)核中對(duì)于文件的訪問則是通過file和inode結(jié)構(gòu)體實(shí)現(xiàn)的,其中包含這訪問文件的關(guān)鍵信息(例如訪問偏移)和方法(例如讀寫文件操作)。

fd=open(“/home/zhf/zhf/c_prj/itworld123.com”,O_RDWR);

進(jìn)程與文件的關(guān)系

如下圖是典型的進(jìn)程與文件的關(guān)系圖,圖中進(jìn)程打開了兩個(gè)不同的文件。在進(jìn)程結(jié)構(gòu)體(task_struct)中有一個(gè)files_struct成員,其中保存這一個(gè)數(shù)組,這個(gè)數(shù)組的偏移量就是文件描述符,而其中的成員則是file結(jié)構(gòu)體的指針。這樣,通過用戶態(tài)的整型的文件描述符可以很方便的找到管理文件的結(jié)構(gòu)體(file)進(jìn)而實(shí)現(xiàn)對(duì)文件的操作。本文為了方便說明,對(duì)files_struct結(jié)構(gòu)體進(jìn)行了簡(jiǎn)化處理,實(shí)際上該結(jié)構(gòu)提要復(fù)雜很多。

圖1 單進(jìn)程概圖

進(jìn)程(task_struct)與文件結(jié)構(gòu)體(file)的關(guān)系清楚了,那么文件結(jié)構(gòu)體又是怎么來的,它跟inode的關(guān)系是什么樣的呢?如上圖所示,每一個(gè)file都有一個(gè)對(duì)應(yīng)的inode的結(jié)構(gòu)體。兩種其實(shí)都對(duì)應(yīng)著一個(gè)磁盤上的具體文件,但又有差異。file其實(shí)對(duì)應(yīng)這一個(gè)打開文件的實(shí)例,而inode一一對(duì)應(yīng)一個(gè)磁盤文件。也就是說一個(gè)磁盤文件對(duì)應(yīng)的file在內(nèi)存中可能有多份,而inode則只會(huì)有一份。后續(xù)我們會(huì)詳細(xì)解釋具體實(shí)現(xiàn)。

父子進(jìn)程與文件的關(guān)系

我們知道在Linux中進(jìn)程都存在一些父子關(guān)系,而且子進(jìn)程會(huì)繼承父進(jìn)程的很多內(nèi)容。那么如果我們fork出一個(gè)子進(jìn)程,此時(shí)子進(jìn)程會(huì)繼承父進(jìn)程文件相關(guān)的內(nèi)容。如果我們使用的是fork系統(tǒng)調(diào)用,此時(shí)子進(jìn)程會(huì)創(chuàng)建一個(gè)新的files_struct實(shí)例,并將父進(jìn)程的內(nèi)容遷移過來,這里說遷移,而不是拷貝,其原因是并不是原封不懂的內(nèi)存拷貝,而是會(huì)做一些處理。比如父進(jìn)程中對(duì)file結(jié)構(gòu)體的指向,在子進(jìn)程中也會(huì)指向,且文件描述符一致,同時(shí)會(huì)增加file結(jié)構(gòu)體實(shí)例的引用計(jì)數(shù),確保使用關(guān)系的正確性。

還有一種情況,Linux操作系統(tǒng)提供了另外一種創(chuàng)建子進(jìn)程的方法,也就是clone方法。通過該方法創(chuàng)建進(jìn)程時(shí)可以指定子進(jìn)程可以不繼承父進(jìn)程的那些內(nèi)容。如果此時(shí)傳入了CLONE_FILES參數(shù),則不會(huì)進(jìn)行files_struct結(jié)構(gòu)體的遷移,而只是增加一個(gè)該結(jié)構(gòu)體的引用計(jì)數(shù)。也就是父進(jìn)程和子進(jìn)程中的files指針指向相同的內(nèi)存區(qū)域,此時(shí)整個(gè)關(guān)系如下圖所示。

圖3 進(jìn)程clone關(guān)系圖

先到這里,后續(xù)本文會(huì)繼續(xù)討論file結(jié)構(gòu)體與inode及磁盤數(shù)據(jù)的關(guān)系。

轉(zhuǎn)自 IT驛站

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容