【问题标题】:Resolving symbolic links algorithm解析符号链接算法
【发布时间】:2017-08-14 01:57:43
【问题描述】:

在 Linux 上解析符号链接的算法应该是什么样的?

类似:

  1. 分割路径到步骤/usr/bin/hello -> ['usr', 'bin', 'hello']

  2. 首先解析/usr -> /something1

  3. 添加下一步并解析/something1/bin -> /something2

  4. 添加下一步并解析/something2/hello -> /something3

这行得通吗?

【问题讨论】:

  • “解析”是指形成一个不包含符号链接的同一个文件的路径吗?在这种情况下,您必须提供一些额外的细节,包括(1)一个符号链接可以指向另一个符号链接; (2) 符号链接可以指向多组件路径(其任何组件都可以是符号链接); (3) 符号链接可以是绝对的也可以是相对的; (4) 符号链接可以指向不存在的路径。
  • @JohnBollinger 它们可以递归吗?
  • “递归”是什么意思?
  • @melpomene /a -> /b/b -> /a
  • 是的,这是可能的。这就是为什么realpath() 会因ELOOP 而失败。

标签: linux algorithm symlink


【解决方案1】:

您真正要查找的是 readlink 命令,它依赖于 POSIX realpath。其算法可用here

正如在一本书中所写的那样,这个想法是这样的:

所有路径类型解析(检查)处理都使用前导斜杠 (/) 的存在与否来指示路径是绝对路径还是相对路径。如果存在斜杠,则将斜杠后面的第一个限定符与 MVS 前缀进行比较,以确定它是否与前缀匹配。如果是这样,那么路径类型将被认为是通过前缀显式解析的。如果未找到匹配项,或不存在斜线,则使用隐式路径类型解析启发式。

部分详情也可here

【讨论】:

    【解决方案2】:

    基本上,当您请求 I/O 时,内核必须经过一系列步骤。内核需要在目录中搜索请求的文件,这不是问题,因为内核总是知道从哪里开始,因为根文件有一个恒定的 inode 编号,它是 ext 系列文件系统中的 inode 2。一旦内核在目录中找到文件名,就会将文件名转换为 inode 编号。因为每个目录只是一种特殊类型的文件,它包含每个条目(文件名,inode)字段,通过搜索目录,内核将能够找到文件的inode。

    一旦内核找到文件的 inode,这个 inode 就会保存 常规文件 的块地址,因此将用于定位存储在该文件中的数据。文件的块地址保存存储在文件中的实际数据。 *常规文件和符号链接文件的区别在于,符号链接文件是指向另一个位置的文件,因此内核必须执行两次相同的一系列步骤,即在找到符号链接文件的inode时内核必须对符号链接文件指向的文件路径重做相同的操作,它必须在目录中搜索并在目录中找到匹配的文件名才能获得 inode 编号。这显然增加了开销。

    递归(又名循环)符号链接是无效的符号链接。

    不确定我是否回答了您的问题,但这通常是发生的情况,您的顶部和下方还有 VFS 层,即物理文件系统。有些文件系统甚至不支持符号链接,比如 vfat。

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      相关资源
      最近更新 更多