Linux檔案描述符

2022-03-24 07:14:10 字數 1558 閱讀 7147

在linux通用i/o模型中,i/o操作系列函式(系統呼叫)都是圍繞乙個叫做檔案描述符的整數展開。這不禁讓人產生疑問:這個整數代表什麼?乙個數值代表乙個檔案嗎?隨便傳乙個整數進去呼叫可以嗎?

玩轉linux舊群已滿,**新群:278378501 。

解答以上疑問,需要更深入學習——檔案描述符(file descriptor)。

理解具體情況,需要了解由核心維護的3個資料結構:

這3個資料結構之間的關係如下圖所示:

核心對所有開啟的檔案維護乙個系統級別的開啟檔案描述表(open file description table),簡稱開啟檔案表。表中條目稱為開啟檔案描述體(open file description),儲存了與乙個開啟檔案相關的全部資訊,包括:

每個檔案系統會為儲存於其上的所有檔案(包括目錄)維護乙個i-node表,單個i-node包含以下資訊:

i-node儲存在磁碟裝置上,核心在記憶體中維護了乙個副本,這裡的i-node為後者。副本除了原有資訊,還包括:引用計數(從開啟檔案描述體)、所在裝置號以及一些臨時屬性,例如檔案鎖。

上圖中,詳細描述了兩個程序諸多檔案描述符,以及相互關係。

在程序a中,檔案描述符1和檔案描述符20都指向同乙個開啟檔案描述體(標號23)。這很可能是通過呼叫dup()系列函式形成的。

檔案描述符複製,在某些場景下非常有用,比如:標準輸入/輸出重定向。在shell下,完成這個操作非常簡單,大部分人都會,但是極少人思考過背後的原理。

大概描述一下需要的幾個步驟,以標準輸出(檔案描述符為1)重定向為例:

開啟目標檔案,返回檔案描述符n;

關閉檔案描述符1;

呼叫dup將檔案描述符n複製到1;

關閉檔案描述符n;

程序a的檔案描述符2和程序b的檔案描述符2都指向同乙個開啟檔案描述體(標號73)。這種情形很可能發生在呼叫fork()派生子程序之後,比如a呼叫fork()派生出b。這時,b作為子程序,從父程序a繼承了檔案描述符表,其中包括圖中標明的檔案描述符2。這就是子程序繼承父程序開啟的檔案這句話的由來。

當然了,程序a通過unix套接字將乙個檔案描述符傳遞給b也會出現類似的情形,但一般檔案描述符數值是不一樣的。同時為2要非常湊巧才發生。

linux檔案描述符

本文介紹了檔案描述符,1 首先說什麼是檔案描述符,它有什麼作用?檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和socket。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案,並指定訪問該檔案的方式,呼叫成功後返回乙個檔案描述符。creat 開啟乙個檔案,如果該檔案不存在,則建立它...

linux檔案描述符

當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是乙個低階的正整數。最前面的三個檔案描述符 0,1,2 分別與標準輸入 stdin 標準輸出 stdout 和標準錯誤 stderr 對應。因此,函式 scanf 使用 stdin,而函式 pri...

Linux 檔案描述符

我們之前就知道在linux作業系統下 一切皆檔案 所以在這個條件下,所有研究的物件都變相的相當於研究檔案,那麼對檔案系統的研究也應該是必須的。我們的核心利用檔案描述符來訪問檔案,每個檔案描述符都是非負整數,開啟現存的檔案或者是新建檔案時,核心會返回乙個檔案描述符,讀寫檔案也需要使用檔案描述符來指定待...