file結構體
FILE結構體:
C語言的stdio.h標頭檔案中,定義了用於檔案操作的結構體FILE。這樣,我們通過fopen返回一個檔案指標(指向FILE結構體的指標)來進行檔案操作。可以在stdio.h(位於visual studio安裝目錄下的include資料夾下)標頭檔案中檢視FILE結構體的定義,如下:
C語言檔案管理的實現:#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程式用不同的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經營著一個不大的水果店.他認為生存之道就