6.4.2 进程的文件管理
对于一个进程打开的所有文件,由进程的两个私有结构进行管理。
记录文件系统信息:指向fs_struct结构的指针,主要数据是文件系统根目录和当前目录所对应的I节点号,指向系统打开文件表。
进程打开文件信息:指向file_struct结构的指针,包含用户打开文件表,是该进程对全部已打开文件进行具体访问的接口。
struct fs_struct {
int count; /* 共享此结构的计数值 */
unsigned short umask; /* 文件掩码 */
struct inode * root, * pwd; /* 根目录和当前目录inode指针 */
};
root是指向当前目录所在的文件系统的根目录inode,在按照绝对路径访问文件时就从这个指针开始。pwd是指向当前目录inode的指针,相对路径则从这个指针开始。
在Linux中,进程是通过文件描述符(简称fd)来访问文件的,文件描述符是一个整数,其作用是描述某个进程同时打开使用的文件序号。Linux规定每个进程最多同时打开使用256个文件描述符。每个进程用一个用户打开文件表描述进程当前使用fd的情况,该表采用files_struct结构数组,包含了进程当前所打开文件的fd及指向系统打开文件表中某一节点的指针。
#define NR_OPEN 256
struct files_struct {
int count; /* 共享该结构的计数值 */
fd_set close_on_exec;
fd_set open_fds;
struct file * fd[NR_OPEN];
};
fd[]每个元素是一个指向file结构体的指针,该数组称为进程打开文件表。进程每打开一个文件时,建立一个file结构体,并加入到系统打开文件表中,然后把该file结构体的首地址写入fd[]数组的第一个空闲元素中。一个进程所有打开的文件都记载在fd[]数组中。fd[]数组的下标称为文件标识号。
图6-7 进程与文件系统数据结构关系
在Linux中,进程使用文件名打开一个文件。在此之后对文件的识别就不再使用文件名,而直接使用文件标识号。在系统启动时文件标识号0、1、2由系统分配:0标识输入设备,1标识输出设备,2标识错误输出设备。
进程与文件系统数据结构的关系参见图6.7。
当一个进程通过fork()创建一个子进程后,子进程共享父进程的打开文件表,子进程两者的打开文件表中下标相同的两个元素指向同一个file结构。 这时file的f_count计数值增1。一个文件可以被某个进程多次打开,每次都分配一个file,并占用该进程打开文件表fd[]的一项,得到一个文件标识号。但它们的file中的f_inode都指向同一个inode。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。