1. 文件IO
1. 基本结构
2. 文件描述符表、文件表、文件结构体、文件描述符之间的关系
文件描述符(fd):一个整数,用于标识进程打开的文件,由用户空间程序使用。
文件描述符表:每个进程都有自己的表,存储着该进程打开的文件描述符,并指向文件表中的 struct file
。
文件表:内核的全局表,存储着所有进程打开的文件信息,每个条目是 struct file
结构体。
文件结构体(struct file
):内核中每个打开文件的具体表示,包含文件的状态和操作函数。
当一个进程打开一个文件时:
- 进程调用
open()
,内核为文件创建一个struct file
对象,并将其放入全局文件表中。 - 内核为进程分配一个文件描述符,并在进程的文件描述符表中为该描述符添加一个条目,该条目指向刚刚创建的
struct file
。 - 文件描述符(如
fd=3
)用于用户程序与内核交互,它通过文件描述符表找到struct file
,然后操作内核中的文件。
当进程对文件进行 read
、write
等操作时:
- 内核通过文件描述符查找进程的文件描述符表,找到指向的
struct file
结构体。 - 通过
struct file
中的操作函数(f_op
)执行对应的文件操作。
3. 同一个文件 文件结构体
同一个文件的 struct file
结构体在某些情况下是唯一的,但在其他情况下可能会有多个不同的 struct file
实例,具体取决于文件是如何被打开的和进程如何操作该文件。
struct file
不一定唯一:同一个文件在以下情况下会有多个 struct file
实例:
- 当一个进程多次使用
open()
打开文件时,每次open()
会产生独立的struct file
。 - 不同的进程各自通过
open()
打开同一个文件时,内核为每个进程分配独立的struct file
。
struct file
可以共享:在以下情况下,多个文件描述符可以共享同一个 struct file
:
- 父子进程通过
fork()
共享相同的文件描述符。 - 使用
dup()
或dup2()
复制文件描述符时,新旧文件描述符共享同一个struct file
。