1. 程式人生 > >檔案描述符與檔案指標

檔案描述符與檔案指標

首先看下下面函式:

FILE* fopen(const char* path, const char* mode)

我們看它的返回值,當檔案順利開啟後,指向該流的檔案指標就會被返回,也就是說這個函式返回值為 FILE* 型別(檔案指標型別)。

再看另一個函式:

int open(const char* pathname, int flags)
int open(const char* pathname, int flags, mode_t mode)

這個函式返回一個int型別的數,其實返回的這個int型別的數,就是檔案描述符。

一、我們先看看這個檔案描述符。

在linux作業系統下,一切皆檔案。當我們開啟某個檔案時,就會獲得該檔案的描述符。每個程序在PCB會儲存著一張檔案描述符表,而這個描述符就是這張表的索引,每個表項都有一個指向已開啟檔案的指標。通俗一點說,每個程序的PCB裡都一個數組(檔案描述符表),這個數組裡儲存著已開啟檔案的指標,而檔案描述符就是該指標所對應的下標。

如下圖:

這裡寫圖片描述

其中系統預設0號下標下是鍵盤檔案的指標,1號下標是顯示器檔案指標,2號下也是顯示器檔案指標。檔案描述符中0代表標準輸入,1代表標準輸出,2代表標準錯誤。檔案描述符是從當前最小未被使用的整數處開始分配的。像上圖中,0,1,2這三個描述符已被使用,那新開啟檔案時,其描述符就為當前被使用的最小整數3處開始。如果現在close(0);那就從0開始分配,但會跳過1、2,因為1、2正在使用中。

    在上圖中我們看到有file結構體和file_struct,連結  http://blog.csdn.net/leewenjin/article/details/7605214     對此有詳細講解。

二、檔案指標

在C語言中用一個指標變數指向一個檔案,這個指標稱為檔案指標。通過檔案指標就可對它所指的檔案進行各種操作。 定義說明檔案指標的一般形式為:
FILE *指標變數識別符號;
其中FILE應為大寫,它實際上是由系統定義的一個結構,該結構中含有檔名、檔案狀態和檔案當前位置等資訊。在編寫源程式時不必關心FILE結構的細節。
在使用檔案時,需要在記憶體中為其分配空間,用來存放檔案的基本資訊,給結構體型別是由系統定義的,C語言規定該型別為FILE型,其宣告如下:

typedef struct  
{
       char *_ptr; //檔案輸入的下一個位置 
    int _cnt; //當前緩衝區的相對位置 
    char *_base; //指基礎位置(即是檔案的其始位置) 
    int _flag; //檔案標誌 
    int _file; //檔案的有效性驗證 
    int _charbuf; //檢查緩衝區狀況,如果無緩衝區則不讀取 
    int _bufsiz; //檔案的大小
    char *_tmpfname; //臨時檔名
}FILE;

例如:

FILE *fp;

表示fp是指向FILE結構的指標變數,通過fp即可找存放某個檔案資訊的結構變數,然後按結構變數提供的資訊找到該檔案,實施對檔案的操作。習慣上也籠統地把fp稱為指向一個檔案的指標。