1. 程式人生 > >file結構體

file結構體

FILE結構體:

C語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體FILE。這樣,我們通過fopen返回一個檔案指標(指向FILE結構體的指標)來進行檔案操作。可以在stdio.h(位於visual studio安裝目錄下的include資料夾下)標頭檔案中檢視FILE結構體的定義,如下:

#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;         //檔案輸入的下一個位置
        int   _cnt;         //當前緩衝區的相對位置
        char *_base;        //基礎位置(檔案的起始位置)
        int   _flag;        //檔案標誌
        int   _file;        //檔案的有效性驗證
        int   _charbuf;     //檢查緩衝區狀況,如果無緩衝則不讀取
        int   _bufsiz;      //當前緩衝區有效大小
        char *_tmpfname;    //臨時檔名
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif  /* _FILE_DEFINED */
C語言檔案管理的實現:

C程式用不同的FILE結構管理每個檔案。程式設計師可以使用檔案,但是不需要知道FILE結構的細節。實際上,FILE結構是間接地作業系統的檔案控制塊
(FCB)來實現對檔案的操作的,如下圖:


  上面圖中的_file實際上是一個描述符,作為進入開啟檔案表索引的整數。

作業系統檔案管理簡介:

從上圖可以看出,C語言通過FILE結構可以間接操作檔案控制塊(FCB)。為了加深對這些的理解,這裡科普下作業系統對開啟檔案的管理。

檔案是存放在物理磁碟上的,包括檔案控制塊(FCB)和資料塊。檔案控制塊通常包括檔案許可權、日期(建立、讀取、修改)、擁有者、檔案大小、資料塊資訊。資料塊用來儲存實際的內容。對於開啟的檔案,作業系統是這樣管理的:

1 系統維護了兩張表,一張是系統級開啟檔案表,一張是程序級開啟檔案表(每個程序有一個)。

系統級開啟檔案表複製了檔案控制塊的資訊等;程序級開啟檔案表儲存了指向系統級檔案表的指標及其他資訊。

系統級檔案表每一項都儲存一個計數器,即該檔案開啟的次數。我們初次開啟一個檔案時,系統首先檢視該檔案是否已在系統級檔案表中,如果不在,則建立該項資訊,否則,計數器加1。當我們關閉一個檔案時,相應的計數也會減1,當減到0時,系統將系統級檔案表中的項刪除。

程序開啟一個檔案時,會在程序級檔案表中新增一項。每項的資訊包括當前檔案偏移量(讀寫檔案的位置)、存取許可權、和一個指向系統級檔案表中對應檔案項的指標

。系統級檔案表中的每一項通過檔案描述符(一個非負整數)來標識。

聯絡上面的內容,可以發現,應該是這樣的:FILE結構體中的_file成員應該是指向程序級開啟檔案表,然後,通過程序級開啟檔案表可以找到系統級開啟檔案表,進而可以通過FCB操作物理磁碟上面的檔案。

相關推薦

Linux下的FILE*結構

FILE*結構體解析 struct file結構體定義在include/Linux/fs.h中定義。檔案結構體代表一個開啟的檔案,系統中的每個開啟的檔案在核心空間都有一個關聯的 struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的

file結構

FILE結構體: C語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體FILE。這樣,我們通過fopen返回一個檔案指標(指向FILE結構體的指標)來進行檔案操作。可以在stdio.h(位於visual studio安裝目錄下的include資料夾下)標頭檔案中檢視

Linux(三)檔案描述符和FILE結構

檔案描述符 在我們介紹檔案描述符之前。我們先來看一下 系統呼叫介面:write,read,close,open,lseek,下面我們來嘗試用下open系統呼叫介面。 我們可以看到,我們通過open建立一個檔案給它許可權0644 接下來我們寫一個whi

FILE結構與fd檔案識別符號

FILE結構體 我們通常對檔案進行操作時,都會使用一些與檔案相關的函式,比如: 開啟檔案:FILE *fopen(const char *path,const char* mode) 關閉檔案:int fclose(FILEE *fp) 讀檔案:si

linux c FILE結構

struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ #define _IO_file_flags _flags /* The following pointers correspond t

簡析檔案描述符(fd)和FILE結構的關係

檔案描述符(fd) 檔案描述符(file descriptor)用來訪問檔案。檔案描述符是非負整數。開啟現存檔案或新建檔案時,核心會返回一個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。 通常情況下,將一個程式從硬碟載入到記憶體後,這個程式就化

linux中檔案描述符fd和struct file結構的釋放

簡單歸納:fd只是一個整數,在open時產生。起到一個索引的作用,程序通過PCB中的檔案描述符表找到該fd所指向的檔案指標filp。 檔案描述符的操作(如: open)返回的是一個檔案描述符,核心會在每個程序空間中維護一個檔案描述符表, 所有開啟的檔案都將通過此表中的檔

探索檔案描述符(fd)與FILE結構之間的關係

檔案描述符(fd) 對於linux而言,所有對裝置(對於linux而言,一切皆檔案)和檔案的操作都使用檔案描述符來進行的。 檔案描述符是一個非負的整數,它是一個索引值,指向核心中每個程序開啟檔案的記錄表。 當開啟一個現存檔案或建立一個新檔案時,核心就向程序返回

3. file、inode結構及chardevs數組等相關知識解析

內核源碼 art 結構 是否 pri lse 區分 功能 好的 https://blog.csdn.net/zqixiao_09/article/details/50850004 下圖描述了Linux中虛擬文件系統,一般的設備文件與設備驅動程序間的函數調用關系 上圖展現了

Linux字元裝置中的兩個重要結構file、inode)

對於Linux系統中,一般字元裝置和驅動之間的函式呼叫關係如下圖所示 上圖描述了使用者空間應用程式通過系統呼叫來呼叫程式的過程。一般而言在驅動程式的設計中,會關係 struct file 和 struct inode 這兩個結構體。 使用者空間使用open()系統呼叫函式開啟一個字元裝置時( int fd

Linux 字元裝置驅動結構(三)—— file、inode結構及chardevs陣列等相關知識解析

       先看下面這張圖,這是Linux 中虛擬檔案系統、一般的裝置檔案與裝置驅動程式值間的函式呼叫關係;         上面這張圖展現了一個應用程式呼叫字元裝置驅動的過程, 在裝置驅動程式的設計中,一般而言,會關心 file 和 inode 這兩個結構體  

檔案結構struct file(Linux 2.6.23核心) (轉)

struct file結構體定義在/linux/include/linux/fs.h(Linux 2.6.11核心)中,其原型是: struct file {         /*          * fu_list becomes invalid after file_

Linux 字元裝置驅動結構(三)—— file、inode結構及chardevs陣列等相關知識解析[轉載]

       先看下面這張圖,這是Linux 中虛擬檔案系統、一般的裝置檔案與裝置驅動程式值間的函式呼叫關係;        上面這張圖展現了一個應用程式呼叫字元裝置驅動的過程, 在裝置驅動程式的設計中,一般而言,會關心 file 和 inode 這兩個結構體       

st_vio——進程間通信接口抽象結構

sock 註釋 windows系統 out rip peer 如果 ifd end 工作忙,學習忙,但還是得隨便寫點。 st_vio,顧名思義,應該是指virtual IO,即虛擬IO。根據代碼裏的註釋,這個是一個高度抽象的進程間通信接口結構體,mysql中,如果不是用C+

Linux下C結構初始化

直觀 tro 擴展性 方式 建議 struct 初始化方式 www 寫到 原文地址在這裏: http://www.cnblogs.com/Anker/p/3545146.html 我 只把裏面的主要介紹和代碼寫到這裏了. 順序初始化   教科書上講C語言結構體初始化

在C語言結構中添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

hdu1873 看病要排隊(結構優先隊列)

正整數 sel print 優先權 數值 事件 sim node sca 看病要排隊 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total

libevent源碼分析1 ----evnet相關結構分析

所有 active 復用 超時 handling 源碼 執行 evb tel 位於代碼event-internal.h中。 event_base類似事件的集合,你創建一個事件,必須將該事件指定一個集合。 struct event_base { 50 const

C語言中,隱藏結構的細節

all printf span 包括 strcpy () 創建 提高 結構體指針 我們都知道,在C語言中,結構體中的字段都是可以訪問的。或者說,在C++ 中,類和結構體的主要區別就是類中成員變量默認為private,而結構體中默認為public。結構體的這一個特性,導致結構

水果,一道對結構排序的水題

呵呵 print mes problem net 空行 沒有 scanf http 題目鏈接:https://vjudge.net/contest/161356#problem/E 夏天來了~~好開心啊,呵呵,好多好多水果~~ Joe經營著一個不大的水果店.他認為生存之道就