Linux中文件指針和文件描述符的區

文件描述符

       在linux系統中打開文件就會獲得文件描述符,它是個很小的正整數。每個進程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是這個表的索引,其實就是文件數組下標,文件描述符是系統調用層次上的,每個表項都一個指向已打開文件的指針。

文件指針

       C語言中使用的是文件指針而不是文件描述符做爲I/O的句柄。文件指針指向進程用戶區中的一個被稱爲FILE結構的數據結構。FILE結構包括一個緩衝區和一個文件描述符。而文件描述符是文件描述符表的一個索引,因此從某種意義上說文件指針就是句柄的句柄(在Windows系統上,文件描述符被稱作文件句柄)。FILE *中除了包含了fd信息,還包含了IO緩衝,是C標準形式,所以FILE *比fd更適合跨平臺,應該多用fopen在,少用open。

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

       這要通過fdopen和fileno兩個函數實現。它們都包含在頭文件stdio.h中。
       fdopen的原型: FILE * fdopen(int filedes, const char *opentype);
       第一個參數filedes是一個打開的文件描述符,opentype是表示打開方式的字符串,和fopen函數具有相同的取值,比如"w"或"w+"等。但是你必須保證該字符串的描述和文件實際的打開方式是匹配的。函數fopen()就是返回打開文件的指針;如果操作失敗,返回空指針null。
     把文件流指針轉換成文件描述符用fileno函數,其原型爲:
    int fileno(FILE *stream);
     它返回和stream文件流對應的文件描述符。如果失敗,返回-1。

     當程序執行時,就已經有三個文件流打開了,它們分別是標準輸入stdin,標準輸出stdout和標準錯誤輸出stderr。和流式文件相對應的是,也有三個文件描述符被預先打開,它們分別是0,1,2,代表標準輸入、標準輸出和標準錯誤輸出。


       像上圖所示,文件指針是文件描述符的一層封裝,文件指針最終調用的還是文件描述符。


發佈了53 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章