linux内核中file结构体并不是物理上存在于硬盘上的,而是用于描述进程与文件的关系和操作的。每当进程打开一个文件的时候,linux内核就会建立一个file结构体,而task_struct里的指向file的链表就会添加一个已经打开的文件。
文件定义在include/linux/fs.h,定义如下,为了方便观看,直接在代码里以注释格式解析。。
文件定义在include/linux/fs.h,定义如下,为了方便观看,直接在代码里以注释格式解析。。
struct file {
/*
* fu_list 在文件书调用后就会不被使用,改用fu_rcuhead
*/
union {
struct list_head fu_list;
struct rcu_head fu_rcuhead;
} f_u;
struct path f_path; /* 描述文件路径的结构体 */
/* 方便书写,格式统一 */
#define f_dentry f_path.dentry
#define f_vfsmnt f_path.mnt
const struct file_operations *f_op;/* 文件操作函数集合,比如读写,ioctl等 */
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;/* 对应打开进程的用户id和用户组id */
struct file_ra_state f_ra;/* 文件预读取 */
unsigned long f_version;/* 版本 */
#ifdef CONFIG_SECURITY
void *f_security;/* 安全作用的指针 */
#endif
/* 私有数据 */
void *private_data;
#ifdef CONFIG_EPOLL
/* 被fs/eventpoll.c里使用把所有的钩子连接到这个文件 */
struct list_head f_ep_links;
spinlock_t f_ep_lock;
#endif
/* mapping只想一个address_space结构体,用作读写缓存 */
struct address_space *f_mapping;
};