Answers:
符号链接指向文件系统中实际文件的名称(inode)。当系统解析该符号链接以找到实际文件并打开它时,它将查找并使用文件的索引节点。此时,您用来获取文件的路径无关紧要。操作系统不缓存的内容是它通过其inode从文件中读取的内容。据我了解,您可以开始通过硬链接读取文件并删除该硬链接(只要文件仍然从其他位置链接),并且只要文件已解决就不会引起问题(名称字符串-> inode)。
一个符号链接是包含一个小文件位置的目标文件(即路径和文件名),在表明它是一个符号链接的目录项的标志。
当您打开符号链接时,操作系统将按照该位置查找目标文件。如果目标本身是符号链接,它也会遵循其位置(1)(2),直到该位置指向不是符号链接的文件为止(我们将其称为FinalFile)。然后,操作系统获取FinalFile的索引节点(索引节点包含元数据,例如修改时间,并且还具有指向文件数据的指针)。最后,FinalFile的索引节点打开。从现在开始,该进程使用该inode读取/写入文件。结果是更改符号链接名称或路径,删除符号链接,更改路径或FinalFile的名称,甚至删除FinalFile(3)对过程无影响;它仍在从同一inode读取。
在大多数情况下,对符号链接的文件数据操作将影响FinalFile(例如,对Symbollink的读取和写入将对FinalFile进行读取/写入),但也有例外:readlink()
系统调用读取符号链接本身的内容。
另一方面,文件元数据操作(如重命名或删除)通常会影响符号链接。但是这里也有例外:lstat()
系统调用类似于stat()
,不同之处在于它返回符号链接本身而不是FinalFile(2)上的信息。
(1)级别数是有限制的,如果符号链接中的位置是相对路径,则事情会变得更加复杂。
(2)阅读symlink(7):符号链接处理以获取更多详细信息。man 7 symlink
(3)该rm
命令或unlink()
系统调用不会物理删除文件。它删除指向文件的索引节点的目录条目。仅当以下两种情况都删除文件本身:a)不再有引用其索引节点的目录条目(硬链接),并且b)没有进程打开文件。
对于Linux而言,这几乎是透明的,与操作系统相比,它与您正在使用的文件系统的关系更大。
它不是常规文件,也不是很小的文件,因为您不能在VFAT分区中创建有效的符号链接,例如,仅通过将符号链接本身复制到该文件即可,因为它是由文件系统直接记录的。
与硬链接的符号链接的不同之处在于,任命是针对硬链接的,而不是像硬链接那样对数据扇区进行配置。
例:
测试1:
echo 'data' >file.txt
这将创建指向扇区10到20 *(*数字仅用于说明)的硬链接file.txt。
测试2:
现在如果呢?
ln file.txt file_2.txt
这创建了一个指向扇区10到20的硬链接file_2.txt(与file.txt相同),因此,如果删除file.txt,扇区10到20仍然保留,并且您可以在file_2.txt中看到数据。 。(file.txt和file_2.txt都像原始文件一样)
测试3:
ln -s file.txt file_sym.txt
将符号链接file_sym.txt指向硬链接file.txt,因此,当您尝试访问file_sym.txt时,将看到file.txt,但是如果删除file.txt,file_sym将不再找到目标。
这些由文件系统管理,例如由linux的ext4模块管理(或者如果它是在内核上编译的),则不管您使用的是Linux还是其他Unix。