2017-08-12 42 views
1

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

喜欢的东西:

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

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

  3. 添加下一步和解决/something1/bin - >/something2

  4. 添加下一个步骤,解决/something2/hello - >/something3

请问这项工作?

+2

通过“解决”,你的意思是形成一个路径到不包含符号链接的文件?在这种情况下,你必须提供一些额外的细节,包括(1)符号链接可以指向另一个符号链接; (2)符号链接可以指向多组件路径(其任何组件可以是符号链接); (3)符号链接可以是绝对链接或相对链接; (4)符号链接可以指向一个不存在的路径。 –

+0

@JohnBollinger他们可以递归吗? – Vad

+0

“递归”是什么意思? – melpomene

回答

1

你实际上在寻找的是readlink命令,它依赖于POSIX realpath。它的算法可here

写在一本书的想法是这样的:

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

一些细节也可here

1

基本上,当你请求一个I/O,内核要经过一系列的步骤。内核需要搜索所需文件的目录,这不是问题,因为内核始终知道从哪里开始,因为根文件具有一个不变的inode编号,它是inode 2文件系统的ext系列。一旦内核找到目录中的文件名,内核就会将文件名转换为inode编号。由于每个目录只是一种特殊的文件,它通过(文件名,inode)字段保存每个条目的条目,通过搜索目录,内核将能够找到文件的inode。

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

递归(a.k.a cyclic)符号链接是无效的符号链接。

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