一个很基础的问题。当我尝试通过提供文件的完全限定路径来打开文件描述符时,执行的确切步骤顺序是什么。
我在寻找
- 这在 Linux 上是如何工作的
- 给定文件名 - 它如何转换为 inode 和磁盘扇区
- linux 文件系统(特别是 ext3 和 ext4)是否维护某种文件名到 inode 的映射?
一个很基础的问题。当我尝试通过提供文件的完全限定路径来打开文件描述符时,执行的确切步骤顺序是什么。
我在寻找
当我们调用“open(filepath)”时,内核执行以下步骤:
有关内部算法的完整信息,您可能需要参考 Maurice J Bach 的伟大经典书籍“UNIX 操作系统的设计”,其中详细描述了这些概念和实现。
除了tmp 的回答:
文件确实是inode。
通常,给定文件在某个目录中有一些条目指向它的 inode。目录是将名称映射到 inode,目录是一种文件。请参阅stat(2)了解 inode 包含的内容(并且可以通过应用程序代码查询),尤其是各种文件类型(普通文件、目录、字符或块设备、fifo、符号链接......)。因此,目录通常是将字符串映射到 inode 的字典(以各种文件系统特定的方式实现)。因此,在目录/bin/
中通常有一个与bashbash
shell的 ELF 可执行文件的 inode相关联的条目(即)。使用readdir(3) - 依次调用getdents(2) - 来读取目录中的条目。/bin/bash
给定的 inode 可能无法通过某个名称访问。这尤其发生在进程打开(2) -ing 文件,然后unlink(2) -ing(同时保留打开的文件描述符)时。这是制作临时文件的首选方式。(当没有更多进程使用它们时,它们将由内核释放)。
给定的 inode 也可能有多个指向它的目录条目。(即一个文件有“多个名称”)这发生在link(2)系统调用中。(符号链接文件是用symlink(2)创建的)。
另见path_resolution(7)和unix 文件系统&文件系统& ext2 & ext3 & ext4 & btrfs &文件系统维基页面的比较。另请阅读这个旧的文件系统描述(一些细节很烂,但总体思路在这里,尤其是VFS的作用)