Linux 檔案結構體struct file

2021-07-13 19:47:36 字數 3825 閱讀 2687

**:

struct file ;

[cpp]view plain

copy

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;  

atomic_t                f_count;  

unsigned int

f_flags;  

mode_t                  f_mode;  

loff_t                  f_pos;  

struct

fown_struct      f_owner;  

unsigned int

f_uid, f_gid;  

struct

file_ra_state    f_ra;  

unsigned long

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;  

spinlock_t              f_ep_lock;  

#endif /* #ifdef config_epoll */

struct

};  

檔案結構體代表乙個開啟的檔案,系統中的每個開啟的檔案在核心空間都有乙個關聯的struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關閉後,核心釋放這個資料結構。在核心建立和驅動原始碼中,struct file的指標通常被命名為file或filp。一下是對結構中的每個資料成員的解釋:

一、union f_u;

其中的struct list_head定義在 linux/include/linux/list.h中,原型為:

struct list_head ;

用於通用檔案物件鍊錶的指標。

struct rcu_head定義在linux/include/linux/rcupdate.h中,其原型為:

[cpp]view plain

copy

/*** struct rcu_head - callback structure for use with rcu

* @next: next update requests in a list

* @func: actual update function to call after the grace period.

*/struct

rcu_head ;  

rcu(read-copy update)是linux 2.6核心中新的鎖機制,具體在這裡有介紹:

二、struct path             f_path;

被定義在linux/include/linux/namei.h中,其原型為:

struct path ;

在早些版本的核心中並沒有此結構,而是直接將path的兩個資料成員作為struct file的資料成員,

struct vfsmount *mnt的作用是指出該檔案的已安裝的檔案系統,

struct dentry *dentry是與檔案相關的目錄項物件。

三、const struct file_operations    *f_op;

被定義在linux/include/linux/fs.h中,其中包含著與檔案關聯的操作,如:

loff_t (*llseek) (struct file *, loff_t, int);

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

等。當開啟乙個檔案時,核心就建立乙個與該檔案相關聯的struct file結構,其中的*f_op就指向的是

具體對該檔案進行操作的函式。例如使用者呼叫系統呼叫read來讀取該檔案的內容時,那麼系統呼叫read最終會陷入核心呼叫sys_read函式,而sys_read最終會調用於該檔案關聯的struct file結構中的f_op->read函式對檔案內容進行讀取。

四、atomic_t                f_count;

atomic_t被定義為:

typedef struct atomic_t;

volatile修飾字段告訴gcc不要對該型別的資料做優化處理,對它的訪問都是對記憶體的訪問,而不是對暫存器的訪問。 

本質是int型別,之所以這樣寫是讓編譯器對基於該型別變數的操作進行嚴格的型別檢查。此處f_count的作用是記錄對檔案物件的引用計數,也即當前有多少個程序在使用該檔案。

五、unsigned int            f_flags;

當開啟檔案時指定的標誌,對應系統呼叫open的int flags引數。驅動程式為了支援非阻塞型操作需要檢查這個標誌。

六、mode_t                  f_mode;

對檔案的讀寫模式,對應系統呼叫open的mod_t mode引數。如果驅動程式需要這個值,可以直接讀取這個字段。

mod_t被定義為:

typedef unsigned int __kernel_mode_t;

typedef __kernel_mode_t         mode_t;

七、loff_t                  f_pos;

當前的檔案指標位置,即檔案的讀寫位置。

loff_t被定義為:

typedef long long       __kernel_loff_t;

typedef __kernel_loff_t         loff_t;八、

[cpp]view plain

copy

struct

fown_struct      f_owner;  

struct

fown_struct在linux/include/linux/fs.h被定義,原型為:  

struct

fown_struct ;  

該結構的作用是通過訊號進行i/o時間通知的資料。

九、unsigned int            f_uid, f_gid;

標識檔案的所有者id,所有者所在組的id.

十、struct file_ra_state    f_ra;

struct file_ra_state結構被定義在/linux/include/linux/fs.h中,原型為:

[cpp]view plain

copy

struct

file_ra_state ;  

結構體儲存檔案,從檔案中讀取結構體

include include include typedef enumtype typedef structcard int fd 0 initialize card void init card card open a file int file open void return 0 read ...

Linux傳送結構體

linux網路通訊 linux下多客戶端聊天軟體 linux程式設計 linux socket send and recevie structure 最近在開發乙個linux下的聊天軟體,好久沒有做c語言的開發了,感覺到很多東西已經生疏了,這下又碰到用socket傳遞結構體的問題,google了一下...

linux檔案系統中的結構體

1.1 struct file struct file結構體定義在include linux fs.h中定義。檔案結構體代表乙個開啟的檔案,系統中的每個開啟的檔案在核心空間都有乙個關聯的 struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關閉後,...