Linux源码:https://elixir.bootlin.com/linux/v4.13.16/source/kernel
struct file的来历
我们知道对于每一个进程OS内核都会分配一个task_struct结构(linux-4.13.16\include\linux\sched.h中),其中有一个类型为files_struct的结构体:
struct task_struct {
......
/* Filesystem information: */
struct fs_struct *fs;
/* Open file information: */
struct files_struct *files;
......
};
而files_struct结构体中最为重要的一项就是文件描述符列表,每打开一个文件,就会在这个列表中分配一项,下标就是文件描述符,每一项都是一个指向struct file 的指针:
#define BITS_PER_LONG 32
#define NR_OPEN_DEFAULT BITS_PER_LONG
struct files_struct {//linux-4.13.16\include\linux\fdtable.h
......
struct file __rcu * fd_array[NR_OPEN_DEFAULT];
};
后面解析Open,read,write函数时的struct file皆是从这这列表中获取的:
struct file {//linux-4.13.16\include\linux\fs.h
union {
struct llist_node fu_llist;
struct rcu_head fu_rcuhead;
} f_u;
struct path f_path;
struct inode *f_inode; /* cached value */
const struct file_operations *f_op;
/*
* Protects f_ep_links, f_flags.
* Must not be taken from IRQ context.
*/
spinlock_t f_lock;
enum rw_hint f_write_hint;
atomic_long_t f_count;
unsigned int f_flags;
fmode_t f_mode;
struct mutex f_pos_lock;
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;
struct list_head f_tfile_llink;
#endif /* #ifdef CONFIG_EPOLL */
struct address_space *f_mapping;
errseq_t f_wb_err;
};