Unix内核中已经打开文件,通过三种数据结构表示:
- 每个进程的进程表中的记录项,包含打开的文件的文件描述符表,与之关联的是:
- 文件描述符标识
- 指向一个文件表项的指针
- 内核为所有打开文件维持一张文件表,每个文件表项代表一个打开文件,包含:
-
- 文件状态标识(读、写、添加、同步、非阻塞等
- 当前文件偏移量
- 指向该文件v节点表项的指针
3. 每个打开文件都有且只有一个V节点(v-node)结构
-
- 文件类型
- 对此文件进行各种操作的函数的指针
- (大多数文件)该文件的i节点(i-node,索引节点)
一个打开的文件的结构如下图所示:
这些信息都是打开文件时从磁盘读入内存的
为什么要有V节点结构呢?对在一个计算机系统上的多文件系统类型提供支持。也称之为虚拟文件系统(所以v-node中的v指的是virtual?)linux没有将相关数据结构分为i-node和v-node,而是采用了一个独立于文件系统的i节点和一个依赖于文件系统的i节点
每个进程都只有自己的进程表项,故而每个进程都有自己的文件表项,但是文件可以被多个进程各自打开而每个打开文件都有且只有一个V节点表,于是会有多个文件表项指向同一个V节点表的情况。
而为什么每个进程都有自己的文件表项而不是每个打开文件都只有一个文件表项呢?首先要知道文件表中的当前文件偏移量指的是每次write之后表示增加缩写的字节数,所以每个进程对应一个文件表保证了每个进程都有自己对该文件的当前偏移量。
时间: 2024-09-30 21:11:15