Linux 檔案描述符fd與FILE結構體

2021-08-15 05:45:09 字數 1576 閱讀 1920

在linux中不是用檔案指標來識別乙個檔案,而是用檔案描述符來識別的。

檔案描述符簡稱fd,它是linux核心所建立的索引,目的就是為了高效管理已經被開啟的檔案。它是乙個非負整數,用來表示被開啟的檔案,而對該檔案所有的i/o操作都是通過該檔案的檔案描述符來執行的。

在乙個程式剛剛啟動時,系統就已經佔了三個檔案描述符了,分別為:0(標準輸入)、1(標準輸出)、2(標準錯誤)。如果此刻程式再開啟或建立乙個新檔案時,該檔案的檔案描述符將是3。因為檔案描述符有自己的分配規則:將當前最小的未被使用的檔案描述符分配給新建立的檔案。

來一張圖看看檔案描述符是怎麼管理檔案的:

如果我們關閉了檔案描述符1呢?來看一段**:

#include 

#include

#include

#include

#include

int main()

printf("fd=%d\n",fd);

fflush(stdout);

close(fd);

exit(0);

}

來看看執行結果:

我們可以看到執行程式之後,多了乙個我們建立的檔案file,用cat命令檢視檔案的內容,發現本該輸出到螢幕上的語句卻寫到了開啟的檔案裡,而且檔案描述符是1

c語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體file。因此我們通過fopen返回乙個檔案指標(指向file結構體的指標)來進行檔案操作。檔案指標指向程序的使用者空間中的file結構體。

可以在stdio.h(位於visual studio安裝目錄下的include資料夾下)標頭檔案中檢視file結構體的定義,如下:

file結構體中最重要的兩個成員變數是:檔案描述符和緩衝區的大小

//c語言檔案指標域檔案描述符之間可以相互轉換

int fileno(file * stream)

file * fdopen(int fd, const

char * mode)

struct _iobuf ;

typedef

struct _iobuf file;

c程式用不同的file結構體管理每個檔案。程式設計師可以使用檔案,但是不需要知道file結構體的細節。實際上,file結構體是間接地作業系統的檔案控制塊(fcb)來實現對檔案的操作的。

file結構體中的_file ,也就是檔案描述符,作為進入開啟檔案表索引的整數。

在linux下程式設計常需要對一些檔案進行操作。有時不同的條件下,需要將檔案指標即控制代碼(file*)、檔案描述符(fd)以及檔案路徑(filepath)進行相互轉換,以滿足實際的程式設計需要。

檔案描述符 到 檔案指標:fd–fdopen()–>file*

檔案指標 到 檔案描述符:file*–fileno()—>fd

檔案描述符 fd

1 首先說什麼是檔案描述符,它有什麼作用?檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和socket。第乙個開啟的檔案是0,第二個是1,依此類推。unix 作業系統通常給每個程序能開啟的檔案數量強加乙個限制。更甚的是,unix 通常有乙個系統級的限制。因為squid 的工作方式,檔案...

Linux 檔案描述符fd 重定向

在學習檔案描述符之前,我們先來看一點其它相關的知識點。我們都知道,對乙個檔案我們可以進行開啟 讀 寫 關閉操作,在我們沒有接觸linux之前,將資訊輸出到顯示器上,我們通常能想到的方法有以下幾種 include include intmain c語言會預設幫我們開啟stdin stdout stde...

檔案描述符FD的含義 檔案控制代碼

使用sudo lsof np itcp stcp listen檢視占用埠的程式 因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份執行它才能夠充分地發揮其功能 檔案控制代碼是windows系統的概念,在linux下稱之為檔案描述符fd file description ...