目的:
学习 Linux 文件模型相关的知识。
正文目录:
-
Linux 的两大抽象
-
文件类型
-
文件描述符
-
通用文件模型:简介
4.1 演示 demo
4.2 相关要点: 与 VFS 的关系 -
通用文件模型:文件描述符和打开文件的关系
5.1 相关的内核数据结构
5.2 列举几种打开文件的情景 -
Linux 的两大抽象
文件是 Linux 系统中最基础最重要的抽象。Linux 遵循一切皆文件的理念。很多交互操作是通过读写文件来完成,即使所涉及的对象看起来并非普通文件。
另外一大抽象是进程。如果说文件是 Linux 系统最重要的抽象概念,进程则仅次于文件。
进程相关的实现复杂且多变,而文件 IO 的实现则相对稳定很多,且更贴近我们的日常操作,所以 以文件作为学习 Linux 内核的切入点是个更好的选择。 -
文件类型
Linux 系统的大多数文件是普通文件或目录,但是也有另外一些文件类型,具体包括如下几种:
普通文件 ( regular file )。
最常用的文件类型,包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于 Linux 内核而言并无区别。
文件中包含的字节可以是任意值,可以以任意方式进行组织。在系统层,除了字节流,Linux 对文件结构没有特定要求。
对普通文件内容的解释由处理该文件的应用程序进行。
文件虽然是通过文件名访问,但文件本身其实并没有直接和文件名关联。相反地,与文件关联的是索引节点 (inode,是index node 缩写)。针对驻留于文件系统上的每个文件,文件系统都会为其分配一个 inode。inode 中会保存和文件相关的元数据,如文件修改时间戳、所有者、类型、长度以及文件数据的位置,但不含文件名,文件名由目录文件负责。
inode 由 inode number 来标识,可以通过 “ls –li” 查看文件的 inode number。
ls -li minicom.log
12582945 -rw-r–r-- 1 root root 665 Jul 10 18:47 minicom.log
目录文件 ( directory file )。
目录也是一种文件类型,这种文件包含了其他文件的文件名以及 inode number。文件通常是通过文件名从用户空间打开,目录用于提供访问文件时需要的名称。
文件名和 inode 之间的配对称为链接 (link)。映射在物理磁盘上的形式,如简单的表或散列,是通过特定文件系统的内核代码来实现和管理的。
如果用户空间的应用请求打开指定文件,内核会打开包含该文件名的目录,然后根据文件名获取 inode number。通过 inode number 可以找到 inode。inode 包含和文件关联的元数据,其中包括文件数据在磁盘上的存储位置。
硬链接 ( hard link )。
不同的文件名可以链接到到同一个 inode。当不同名称的多个链接映射到同一个索引节点时,我们称该链接为硬链接。
硬链接通常要求链接和文件位于同一文件系统中。
在底层文件系统支持的前提下,也只有超级用户才能创建指向目录的硬链接。
符号链接 ( symbolic link )。
符号链接是对一个文件的间接指针,它与硬链接有所不同,硬链接直接指向文件的 inode。引入符号链接的原因是为了避开硬链接的一些限制。
硬链接不能跨越多个文件系统,因为 inode number在自己的文件系统之外没有任何意义。为了跨越文件系统建立链接,Linux 系统实现了符号链接。
特殊文件 (specia