關於檔案描述符

2021-12-29 22:45:50 字數 2671 閱讀 1496

關於檔案描述符:檔案描述符(file_struct)是乙個非負整數,對於linux核心而言,為了高效管理已經被開啟的檔案所建立的索引,作業系統在每個程序描述符中都提供了檔案描述符表。

檔案描述符表中每個表項都有乙個指向已經開啟檔案的指標;而已經開啟的檔案在核心中用file結構體表示,檔案描述符中的指標指向file結構體;下面,我們首先來介紹一下file結構體:

file結構體定義在linux系統中的(/kernels/include/linus/fs.h)檔案中,它的源**如下:

struct file f_u;

struct path f_path;

#define f_dentry f_path.dentry

#define f_vfsmnt f_path.mnt

const struct file_operations *f_op;

spinlock_t f_lock; /* f_ep_links, f_flags, no irq */

atomic_long_t f_count;

unsigned int f_flags;

fmode_t f_mode;

loff_t f_pos;

struct fown_struct f_owner;

const struct cred *f_cred;

struct file_ra_state f_ra;

u64 f_version;

#ifdef config_security

void *f_security;

#endif

/* needed for tty driver, and maybe others */

void *private_data;

#ifdef config_epoll

/* used by fs/eventpoll.c to link all the hooks to this file */

struct list_head f_ep_links;

#endif /* #ifdef config_epoll */

struct address_space *f_mapping;

#ifdef config_debug_writecount

unsigned long f_mnt_write_state;

#endif

};其中重要引數引數介紹如下:

f_flags:表示開啟檔案的許可權

f_pos:表示當前讀寫檔案的位置

f_count:這個是乙個相對來說比較重要的引數,表示開啟檔案的引用計數,如果有多個檔案指標指向它,就會增加f_count的值。

f_mode:設定對檔案的訪問模式,例如:唯讀,只寫等。

當我們開啟乙個檔案時,作業系統為了管理所開啟的檔案,都會為這個檔案建立乙個file結構體,而file結構體中的f_op指標又指向file_operations結構體,這個結構體中的成員除了struct module* owner其餘都是函式指標,file_operation就是把系統呼叫和驅動程式關聯起來的關鍵資料結構。這個結構的每乙個成員都對應著乙個系統呼叫。讀取file_operation中相應的函式指標,接著把控制權轉交給函式,從而完成了linux裝置驅動程式的工作。

我們先來看看file_operations結構體的實現和相關成員的介紹:

struct file_operations ;好了,上面我們介紹了file和file_operations結構體,下面我們來畫一幅圖,理清一下檔案描述符和這兩種結構體之間的關係:

首先我們來看看linux系統中所定義的三個標準檔案描述符:

前面我們知道,當我們開啟乙個檔案或者建立乙個檔案,作業系統就會給指向這個檔案的指標關聯乙個檔案描述符,並新增到當前程序下的檔案描述符表中;那麼作業系統每次會怎樣分配檔案描述符呢???是這樣做了,作業系統所分配的檔案描述符是當前可分配的檔案描述符的最小值!我們寫一段**來驗證一下:

還要注意的檔案描述符的分配數量是有限制的,它的可分配範圍為:0~open_max-1;

檔案描述符(file_struct)是作業系統用來管理檔案的資料結構,當我們建立乙個程序時,會建立檔案描述符表,程序控制塊pcb中的fs指標指向檔案描述符表,當我們建立檔案時,會為指向該檔案的指標file*關聯乙個檔案描述符並新增在檔案描述符表中。在檔案描述符表中fd相當於陣列的索引,file*相當於陣列的內容嗎,指向乙個檔案結構體。

關於檔案描述符

在linux下進行read和write時,發現當返回乙個檔案描述符,對它進行write操作,之後馬上read,讀出來的資料都是0,當時很奇怪,因為檔案描述符只是乙個int型的整數,不同於c下的fwrite,是直接返回乙個檔案指標,每次讀寫這個指標也會隨之而變化,於是查詢了關於檔案描述符的資料。檔案描...

關於檔案描述符

檔案描述符在形式上是乙個非負整數。核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。實際上,它是乙個索引值,指向 核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...