檔案描述符與檔案指標

2021-07-31 22:12:31 字數 1675 閱讀 1691

檔案描述符這一概念往往只適用於unix、linux這樣的作業系統。

什麼是檔案描述符?

程序利用檔案描述符來訪問檔案。檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向每乙個程序所維護的該程序開啟檔案的記錄表。當程式開啟乙個現有檔案或者建立乙個新檔案時,程序就返回乙個檔案描述符。
每個linux程序都應該有三個標準的檔案描述符,對應三個標準流。

fd(0)對應標準輸入(stdin),對應的裝置鍵盤(檔案)。

fd(1)對應標準輸出(stdout),對應的裝置顯示器(檔案)。

fd(2)對應標準錯誤(stderror),對應的裝置顯示器(檔案)。

在linux中,每個程序會在程序控制塊(task_struct)當中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表都有乙個指向已經開啟檔案的指標。

什麼是檔案指標?

在c語言中,乙個指標變數指向乙個檔案,則這個指標就是檔案指標。檔案指標指向程序使用者區中的乙個被稱為file結構的資料結構。
檔案描述符是唯一的,但是檔案指標不是唯一的,檔案指標指向的物件是唯一的。檔案描述符是檔案描述符表的乙個索引,因此從某些意義上來說,檔案指標就是檔案描述符的控制代碼。c語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體file

#define null 0

#define eof (-1)

#define bufsiz 1024

#define open_max 20 // 一次開啟的最大檔案數

// 定義file結構體

typedef struct _iobuf file;

extern file _iob[open_max];

#define stdin (&_iob[0]) // stdin 的檔案描述符為0

#define stdout (&_iob[1]) // stdout 的檔案描述符為1

#define stderr (&_iob[2]) // stdout 的檔案描述符為2

enum _flags ;

int _fillbuf(file *); // 函式宣告,填充緩衝區

int _flushbuf(int, file *); // 函式宣告,重新整理緩衝區

#define feof(p) ((p)->flag & _eof) != 0)

#define ferror(p) ((p)->flag & _err) != 0)

#define fileno(p) ((p)->fd)

#define getc(p) (--(p)->cnt >= 0 \

? (unsigned char) *(p)->ptr++ : _fillbuf(p))

#define putc(x,p) (--(p)->cnt >= 0 \

? *(p)->ptr++ = (x) : _flushbuf((x),p))

#define getchar() getc(stdin)

#define putcher(x) putc ((x), stdout)

檔案指標和檔案描述符

原文 檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的...

檔案指標和檔案描述符

檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的指標。...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...