1

一个很基础的问题。当我尝试通过提供文件的完全限定路径来打开文件描述符时,执行的确切步骤顺序是什么。

我在寻找

  • 这在 Linux 上是如何工作的
  • 给定文件名 - 它如何转换为 inode 和磁盘扇区
  • linux 文件系统(特别是 ext3 和 ext4)是否维护某种文件名到 inode 的映射?
4

2 回答 2

4

当我们调用“open(filepath)”时,内核执行以下步骤:

  1. 将文件名转换为 inode。
  2. 为 inode 分配一个新的文件表条目,初始化各种东西(每个进程)。
  3. 分配用户文件描述符条目并存储到文件表条目(全局数据结构)中。
  4. 将用户文件描述符返回给调用者。

有关内部算法的完整信息,您可能需要参考 Maurice J Bach 的伟大经典书籍“UNIX 操作系统的设计”,其中详细描述了这些概念和实现。

于 2014-03-30T15:18:29.897 回答
3

除了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的作用)

于 2014-03-30T16:40:30.103 回答