文件指針FILE*及文件描述符fd

文件指針

   在C語言中,通過文件指針可以對文件進行相應的操作,定義說明文件指針的一般形式爲:FILE *指針變量標識符。

   FILE實際是由系統定義的一個結構體,它包含的字段有文件描述符和緩衝區等。

   通常程序運行後會打開:stdin--文件輸入流,stdout--文件輸出流,stderr--文件錯誤流,它們對應了鍵盤、顯示器、顯示器,它們的類型都爲FILE*。

   由於fwrite,printf都有緩衝區,而緩衝區由C語言提供,主要影響讀寫,所以FILE結構體中包含了緩衝區字段。

FILE結構體:

#include<stdio.h>
struct _iobuf { 

char *_ptr; //文件輸入的下一個位置 

int _cnt; //當前緩衝區的相對位置 

char *_base; //指基礎位置(即是文件的其始位置) 

int _flag; //文件標誌 

int _file; //文件的有效性驗證 

int _charbuf; //檢查緩衝區狀況,如果無緩衝區則不讀取 

int _bufsiz; //文件的大小 

char *_tmpfname; //臨時文件名 

}; 

typedef struct _iobuf FILE;

文件描述符fd

    內核利用文件描述符fd(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件。

    每個程序運行時,都會打開stdin,stdout,stderr,它們對應的文件描述符依次爲0,1,2,而文件描述符從當前未被使用的最小文件描述符開始依次使用,所以一般程序運行後,新建文件的文件描述符會從3開始使用。

    每個進程在進程控制塊PCB中都有一個文件描述符表,文件描述符fd是張表的索引,這張表的每個表項都有一個指向已打開文件的指針,而已打開的文件在內核中使用FILE結構體表示。

文件描述符表:
這裏寫圖片描述

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

   文件描述符fd:只要打開文件,就會獲得一個非負整數的文件描述符fd。
   文件指針FILE:進程在PCB中通過fd找到它所指向的文件指針FILE*,而文件指針指向進程中的FILE結構體,它包含文件描述符和緩衝區等字段。
   所以,它們是完全不同的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章