linux内核file结构

linux内核中file结构体并不是物理上存在于硬盘上的,而是用于描述进程与文件的关系和操作的。每当进程打开一个文件的时候,linux内核就会建立一个file结构体,而task_struct里的指向file的链表就会添加一个已经打开的文件。
文件定义在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;
};

你可能感兴趣的:(c,linux,kernel,内核)