在Linux上解析符号链接的算法应该是什么样的?
类似的东西:
拆分步骤/usr/bin/hello
的路径 - > ['usr', 'bin', 'hello']
首先解析/usr
- > /something1
添加下一步并解析/something1/bin
- > /something2
添加下一步并解析/something2/hello
- > /something3
这会起作用吗?
答案 0 :(得分:1)
您实际需要的是readlink
命令,它依赖于POSIX realpath
。其算法可用here
正如一本书中所写,这个想法是这样的:
所有路径类型解析(检查)处理使用是否存在前导斜杠(/)来指示路径是绝对路径还是相对路径。如果存在斜杠,则将斜杠后面的第一个限定符与MVS前缀进行比较,以确定它是否与前缀匹配。如果是,则将认为路径类型通过前缀显式解析。如果未找到匹配项,或者没有斜杠,则使用隐式路径类型解析启发式。
也可以获得一些详细信息here
答案 1 :(得分:1)
基本上,当您请求I / O时,内核必须经过一系列步骤。内核需要在目录中搜索所请求的文件,这不是问题,因为内核总是知道从哪里开始,因为根文件有一个常量的inode编号,它在ext系列文件系统中是inode 2 。然后,一旦内核在目录中找到文件名,内核就会将文件名转换为inode编号。因为每个目录只是一种特殊的文件,它在每个条目中保存条目(filename,inode)字段,通过搜索目录,内核将能够找到文件的inode。
一旦内核找到文件的inode,此inode将保存常规文件的块地址,因此将用于定位存储在该文件中的数据。文件的块地址包含存储在文件中的实际数据。 *常规文件和符号链接文件之间的区别在于,符号链接文件是指向另一个位置的文件,因此内核必须执行两次相同的一系列步骤,即,当找到符号链接文件的inode时内核必须为符号链接文件指向的文件路径重做相同的操作,它必须在目录中搜索并在目录中找到匹配的文件名以获取inode编号。这显然增加了开销。
递归(a.k.a cyclic)符号链接是无效的符号链接。
我不确定我是否已经回答了您的问题,但通常会发生这种情况,您还可以在顶部和下方安装VFS图层,即物理文件系统。有些文件系统甚至不支持符号链接,比如vfat。