文件指針和文件描述符的區別

在linux系統中把設備和普通文件也都看做是文件,要對文件進行操作就必須先打開文件,打開文件后會得到一個文件描述符,它是一個很小的正整數,是一個索引值。

內核會為每一個運行中的進程在進程控制塊pcb中維護一個打開文件的記錄表,每一個表項都有一個指針指向打開的文件,上邊的索引值是記錄表的索引值。

文件描述符的優點:兼容POSIX標準,許多系統調用都依賴于它;缺點是不能移植到unix之外的系統上去。

文件指針:c語言中使用的是文件指針而不是文件描述符來作為I/O的句柄,文件指針指向進程的用戶空間中一個FILE結構的數據結構,FILE

結構里主要包括一個I/O緩沖區和一個文件描述符,而文件描述符值是文件描述符表中的一個索引,從某種意義上將文件指針就是句柄的句柄(在Window中

文件描述符被稱為文件句柄)。

文件指針的優點:是c語言中的通用格式,便于移植。

既然FILE結構中含有文件描述符,那么可以使用fopen來獲得文件指針,然后從文件指針獲取文件描述符,文件描述符應該是唯一的,而文件指針卻不是唯一的,但指向的對象是唯一的。

C語言文件指針域文件描述符之間可以相互轉換

int fileno(FILE * stream)

FILE * fdopen(int fd, const char * mode)

FILE的結構

struct _iobuf {

char *_ptr; ?????????//緩沖區當前指針

int ??_cnt;

char *_base; ????????//緩沖區基址

int ??_flag; ????????//文件讀寫模式

int ??_file; ????????//文件描述符

int ??_charbuf; ?????//緩沖區剩余自己個數

int ??_bufsiz; ??????//緩沖區大小

char *_tmpfname;

};

typedef struct _iobuf FILE;

open和fopen的區別

| open ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | fopen ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

|----------------------------+----------------------------- |

| open返回一個文件描述符 ? ?| 返回FILE * ? ? ? ? ? ? ? ? ? ? ? ? ?|

| 無緩沖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| 有緩沖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|

| 與write()和read()配合使用 | 與fwrite()和fread()配合使用 ?|

int fd = open("TAGS", O_RDONLY);

FILE * fp = fopen("TAGS", "r");

printf("%d %d\n", fd, fp->_file);

可以從文件指針中獲取文件描述符

fileno(fp) 和fp->_file效果是一樣的

FILE * fp = fdopen(fd, "r") 根據文件描述符加上訪問模式可以得到文件指針

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • C/C++輸入輸出流總結 前兩天寫C++實習作業,突然發現I/O是那么的陌生,打了好長時間的文件都沒有打開,今天終...
    LuckTime閱讀 1,752評論 0 6
  • 內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件...
    踩在浪花上00閱讀 773評論 0 1
  • 今天路過天橋底 發現露宿者蓋的被子跟我的同款 一模一樣 頓時很有親切感
    留子堯閱讀 396評論 0 3
  • 有隨手寫點東西抄記東西的習慣本人是個拖延癥患者且已到晚期一直在想但沒行動整理保存它們終于我再一次因拖延想抽自己了在...
    明聿閱讀 290評論 1 1
  • 像素到底是不是越高越好?近些年來我們好像被搞迷糊了。 諾基亞在做加法的4100萬像素,光是像素數量已經比目前像素最...
    星球視頻特效閱讀 7,510評論 0 7