Linux task_struct和文件系统的关系

 

在内核进程运行的时候,有current 宏对应目前进程task_struct结构

 

Linux进程主要数据结构之间的关系。

 

如图:

 

一个进程文件位置是有fs_struct描述的,进程打开的文件是有files_struct描述的,具体打开的文件描述符是有file控制的。

 一:fs_struct

count 域表示共享同一 fs_struct 表的进程数目。 umask 域由 umask 系统调用使用,用于为新创建的文件设置初始文件许可权。


fs_struct 中的 dentry 结构是对一个目录项的描述, root、 pwd 及 altroot 三个指针都指向这个结构。 其中, root 所指向的 dentry 结构代表着本进程所在的根目录, 也就是在用户登录进入系统时所看到的根目录; pwd 指向进程当前所在的目录; 而 altroot 则是为用户设置的替换根目录。 实际运行时, 这三个目录不一定都在同一个文件系统中。 例如, 进程的根目录通常是安装于 “ /”节点上的 Ext2 文件系统,而当前工作目录可能是安装于/msdos的一个 DOS 文件系统。 因此, fs_struct 结构中的 rootmnt、 pwdmnt 及 altrootmnt 就是对那三个目录的安装点的描述, 安装点的数据结构为 vfsmount。

二:files_struct

每个进程用一个 files_struct 结构来记录文件描述符的使用情况, 这个 files_struct结构称为用户打开文件表, 它是进程的私有数据。 files_struct 结构在include/linux/sched.h 中定义如下:

 

 

fd 域指向文件对象的指针数组。 该数组的长度存放在 max_fds 域中。 通常, fd 域指向files_struct 结构的 fd_array 域, 该域包括 32 个文件对象指针。 如果进程打开的文件数目多于 32, 内核就分配一个新的、 更大的文件指针数组, 并将其地址存放在 fd 域中; 内核同时也更新 max_fds 域的值。

 

对于在 fd 数组中有入口地址的每个文件来说, 数组的索引就是文件描述符( file
descriptor)。 通常, 数组的第一个元素( 索引为 0) 是进程的标准输入文件, 数组的第二个元素( 索引为 1) 是进程的标准输出文件, 数组的第三个元素( 索引为 2) 是进程的标准错误文件( 参见图 8.3)。 请注意, 借助于 dup( )、 dup2( )和 fcntl( ) 系统调用, 两个文件描述符就可以指向同一个打开的文件, 也就是说, 数组的两个元素可能指向同一个文件对象。 当用户使用 shell 结构( 如 2>&1) 将标准错误文件重定向到标准输出文件上时,用户总能看到这一点。
open_fds 域包含 open_fds_init 域的地址, open_fds_init 域表示当前已打开文件的文件描述符的位图。 max_fdset 域存放位图中的位数。 由于数据结构 fd_set 有 1024 位, 通常不需要扩大位图的大小。 不过, 如果确实必须的话, 内核仍能动态增加位图的大小, 这非常类似文件对象的数组的情形。

三:struct file

    

这个是我们操作时文件描述符fd时对应的结构,如文件操作f_op.

Logo

更多推荐