文件描述符FD,文件表,vnode节点与inode节点

分类: unix |
对于每个进程,task_struct包含一个files_struct结构(或叫文件描述符表),它里面有个file数组,用来记录文件描述符的使用情况,定义在include/linux/file.h中
struct files_struct
{
atomic_t
count; //使用该表的进程数
struct
fdtable *fdt;
struct
fdtable fdtab;
spinlock_t
file_lock ____cacheline_aligned_in_smp;
int
next_fd; //数值最小的最近关闭文件的文件描述符,下一个可用的文件描述符
struct
embedded_fd_set close_on_exec_init;
//执行exec时需要关闭的文件描述符初值集合
struct
embedded_fd_set open_fds_init; //文件描述符的屏蔽字初值集合
struct
file * fd_array[NR_OPEN_DEFAULT];
//默认打开的fd队列(文件描述符作为数组下标直接访问file,file中并没有文件描述符,files_struct中只记录下一个可用的文件描述符;dup或dup2函数即是在数组中增加一个file指针,指向已有描述符指向的file对象;打开新文件,即是创建一个新的file对象,并在数组中用下个一可用fd作下标存放file指针,并向应用返回fd)
};
struct
fdtable {
unsigned
int max_fds;
struct file
** fd; //指向打开的文件描述符列表的指针,开始的时候指向fd_array,当超过max_fds时,重新分配地址
fd_set
*close_on_exec;
//执行exec需要关闭的文件描述符位图(fork,exec即不被子进程继承的文件描述符)
fd_set
*open_fds; //打开的文件描述符位图
struct
rcu_head rcu;
struct
fdtable *next;
};
其中file结构:
struct file {
#define f_dentry
f_path.dentry
#define f_vfsmnt
f_path.mnt
#ifdef CONFIG_SECURITY
#endif
#ifdef CONFIG_EPOLL
#endif
#ifdef CONFIG_DEBUG_WRITECOUNT
#endif
};
file结构中的文件操作结构file_operations:
struct file_operations {
};
file结构中的path结构:
struct path {
struct vfsmount *mnt; //该文件已安装的文件系统
struct dentry
*dentry; //与文件相关的目录项对象,内部有个inode成员
};
};
path结构中的dentry结构:
struct dentry
{
atomic_t d_count;
//目录项对象使用计数器,可以有未使用态,使用态和负状态
unsigned int d_flags;
//目录项标志
struct inode *
d_inode; //与文件名关联的索引节点
struct dentry * d_parent;
//父目录的目录项对象
struct list_head d_hash;
//散列表表项的指针
struct list_head d_lru;
//未使用链表的指针
struct list_head d_child;
//父目录中目录项对象的链表的指针
struct list_head
d_subdirs; //对目录而言,表示子目录目录项对象的链表
struct list_head d_alias;
//相关索引节点(别名)的链表
int d_mounted;
//对于安装点而言,表示被安装文件系统根项
struct qstr d_name;
//文件名
unsigned long
d_time;
struct dentry_operations
*d_op; //目录项方法
struct super_block *
d_sb; //文件的超级块对象
vunsigned long
d_vfs_flags;
void * d_fsdata;
//与文件系统相关的数据
unsigned char d_iname
[DNAME_INLINE_LEN]; //存放短文件名
};
索引inode结构:
struct list_head
i_hash;
struct list_head
i_list;
struct list_head
i_dentry;
struct list_head
i_dirty_buffers;
unsigned long i_ino;
//节点号
atomic_t i_count;
kdev_t i_dev;
umode_t i_mode;
nlink_t i_nlink;
uid_t i_uid;
gid_t i_gid;
kdev_t i_rdev;
loff_t i_size;
time_t i_atime;
time_t i_mtime;
time_t i_ctime;
unsigned long
i_blksize;
unsigned long
i_blocks;
unsigned long
i_version;
struct semaphore
i_sem;
struct semaphore
i_zombie;
struct inode_operations
*i_op;
struct file_operations
*i_fop;
struct super_block
*i_sb;
wait_queue_head_t
i_wait;
struct file_lock
*i_flock;
struct address_space
*i_mapping;
struct address_space
i_data;
struct dquot
*i_dquot[MAXQUOTAS];
struct pipe_inode_info
*i_pipe;
struct block_device
*i_bdev;
unsigned long
i_dnotify_mask;
struct dnotify_struct
*i_dnotify;
unsigned long
i_state;
unsigned int
i_flags;
unsigned char
i_sock;
atomic_t
i_writecount;
unsigned int
i_attr_flags;
__u32
i_generation;
union {
struct minix_inode_info minix_i;
struct ext2_inode_info ext2_i;
struct hpfs_inode_info hpfs_i;
struct ntfs_inode_info ntfs_i;
struct msdos_inode_info msdos_i;
struct umsdos_inode_info umsdos_i;
struct iso_inode_info
isofs_i;
struct nfs_inode_info
nfs_i;
struct sysv_inode_info sysv_i;
struct affs_inode_info
affs_i;
struct ufs_inode_info
ufs_i;
struct efs_inode_info
efs_i;
struct romfs_inode_info
romfs_i;
struct shmem_inode_info
shmem_i;
struct coda_inode_info
coda_i;
struct smb_inode_info
smbfs_i;
struct hfs_inode_info
hfs_i;
struct adfs_inode_info
adfs_i;
struct qnx4_inode_info
qnx4_i;
struct bfs_inode_info
bfs_i;
struct udf_inode_info
udf_i;
struct ncp_inode_info
ncpfs_i;
struct proc_inode_info
proc_i;
struct socket
socket_i;
struct
usbdev_inode_info
usbdev_i;
void
*generic_ip;
} u ;
struct inode {
};
inode中的union,可见支持不同的文件类型,包括socket.
复制两张图:
前一篇:一口气搞懂「文件系统」
后一篇:缓冲IO与非缓冲IO