文件系统中各种概念的关系梳理:
1. Linux为每个进程维护一个task_struct结构体来维护进程信息,task_struct可以被称为进程描述符(Process Descriptor)或者进程控制块(Process Control Block)
2. task_struct中有一个指针struct files_struct *files指向files_struct结构体,files_struct被称为文件描述符表。文件描述符表中的每个表项是指向一个已打开的文件的指针(file*)
Sam注:
file是linux内核实现的,是内核用来管理文件的,一般我们不会接触到;而
FILE是标准C封装的,FILE中包含fd的信息,而且还包含IO缓冲,所以可以理解为FILE*是对fd的封装,我们在编写C文件操作时会经常用到。
563 struct file {
564 struct list_head f_list;
565 struct dentry *f_dentry;
566 struct vfsmount *f_vfsmnt;
567 struct file_operations *f_op;
568 atomic_t f_count;
569 unsigned int f_flags;
570 mode_t f_mode;
571 loff_t f_pos;
572 unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;
573 struct fown_struct f_owner;
574 unsigned int f_uid, f_gid;
575 int f_error;
576
577 unsigned long f_version;
578
579 /* needed for tty driver, and maybe others */
580 void *private_data;
581
582 /* preallocated helper kiobuf to speedup O_DIRECT */
583 struct kiobuf *f_iobuf;
584 long f_iobuf_lock;
585 };
564 struct list_head f_list;
565 struct dentry *f_dentry;
566 struct vfsmount *f_vfsmnt;
567 struct file_operations *f_op;
568 atomic_t f_count;
569 unsigned int f_flags;
570 mode_t f_mode;
571 loff_t f_pos;
572 unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;
573 struct fown_struct f_owner;
574 unsigned int f_uid, f_gid;
575 int f_error;
576
577 unsigned long f_version;
578
579 /* needed for tty driver, and maybe others */
580 void *private_data;
581
582 /* preallocated helper kiobuf to speedup O_DIRECT */
583 struct kiobuf *f_iobuf;
584 long f_iobuf_lock;
585 };
3. 进程通过文件描述符表的索引,如
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
来索引到一个file结构体实例,即表示一个打开的文件
4. file实例中有一个f_dentry成员,指向内存中dentry_cache中的一个dentry
dentry: 实现了文件名和inode编号的映射,当然还有其他功能
5. inode: 一个文件对应的inode包含这个文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息,还有文件在数据块中存放位置的指针。每个文件(包括目录以及/proc目录下的文件)都有对应的inode,inode包括磁盘上的和内存中的inode,只有在需要时,Linux才会内存中创建inode.
inode又分两种:
(1) 磁盘上的inode: 跟在超级块后面的"i节点表"中,如下图所示
(2) 内存中的inode:
参考文档:
file:///C:/Users/nnnn/Desktop/VFS/linux%E5%91%BD%E4%BB%A4%E5%AE%9E%E8%B7%B5-%E5%85%B3%E4%BA%8Einode%20-%20%E5%8F%AF%E8%8B%A6%E5%8F%AF%E4%B9%90%20-%2051CTO%E6%8A%80%E6%9C%AF%E5%8D%9A%E5%AE%A2.htm
file:///C:/Users/nnnn/Desktop/VFS/linux%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%9F%BA%E7%A1%80%E5%BF%85%E5%A4%87%EF%BC%88%E4%B8%89%EF%BC%89%EF%BC%9A%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6file%20descriptor%E4%B8%8Einode%E7%9A%84%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86_Linux_%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F_%E7%BD%91%E7%BB%9C%E5%AD%A6%E9%99%A2_%E5%A4%A9%E6%96%B0%E7%BD%91.htm
file:///C:/Users/nnnn/Desktop/VFS/Linux%20%E7%9A%84%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%28%E5%BC%BA%E7%83%88%E6%8E%A8%E8%8D%90%29%20demo%E5%A4%A7%E5%85%A8.htm