我们如何通过文件描述符与 Linux 文件系统交互?
文件描述符代表一个打开的文件。它是操作系统分配给每个文件的唯一编号。它是处理文件的一个抽象概念。我们需要使用文件描述符来读取或写入程序中的文件。每个进程都维护自己的文件描述符表。
下图显示了 Linux 文件系统的分层架构。让我们以进程 1234 为例。
1.用户空间
当我们在进程 1234 中打开一个名为 “fileA.txt ”的文件时,会得到文件描述符 fd1,它等于 3。然后,我们可以将文件描述符传递给其他函数,向文件写入数据。
2.内核空间
在 Linux 内核中,有一个进程表来维护进程的数据。每个进程在表中都有一个条目。每个进程都维护一个以文件描述符为索引的文件描述符表。请注意,每个文件描述符表中都保留了文件描述符 0、1 和 2,分别代表 stdin、stdout 和 stderr。
文件指针指向打开文件表中的一个条目,该表包含所有进程中打开文件的信息。多个文件描述符可以指向同一个文件表项。例如,文件描述符 0、1 和 2 指向同一个打开文件表项。
由于不同的打开文件表项可以代表同一个文件,因此多次存储文件静态信息是一种资源浪费。我们需要另一个名为 “vnode 表 ”的抽象层来存储静态数据。
在每个文件表条目中,都有一个 vnode 指针,它指向 vnode 表中的一个条目。静态信息包括文件类型、函数指针、引用计数、inode 等。
3.文件系统
inode 数组元素存储实际文件信息,包括权限模式、所有者、时间戳等。