檔案描述符這一概念往往只適用於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操作的...