Unix中unlink和rm的区别

7
这两个命令有什么真正的区别?为什么删除文件的系统调用被称为unlink而不是delete

1
你说的delete()函数是什么意思? - merlin2011
删除(delete())函数就像移除(remove())函数一样。 - veeyikpong
你可能是在提到 rm 命令吗? - merlin2011
1个回答

12
你需要了解一些关于Unix文件系统的原始信息才能理解这个非常重要的问题。与其它同期操作系统不同(60年代末、70年代初),Unix没有将文件名与实际目录信息(即文件存储在磁盘上的位置)一起存储。相反,Unix创建了一个单独的“索引节点表”来包含目录信息并标识实际文件,然后允许单独的文本文件成为名称和索引节点的目录。最初,目录文件被认为是像所有其他文件一样使用纯文本文件进行操作,使用现今Shell程序员熟悉的相同工具(如cat、cut、sed等)。
这种架构决策的一个重要后果是,单个文件可以有多个名称!每个inode在特定目录文件中的出现都是指向inode的链接,因此它是已知的。要将文件名连接到文件的inode(即“实际”文件),您需要“链接”它,当您从目录中删除名称时,“取消链接”它。
当然,取消链接文件名并不自动意味着您正在从磁盘中删除/移除该文件,因为该文件可能仍然通过其他目录中的其他名称而被知道。索引节点表还包括链接计数以跟踪inode(文件)被多少名称所知道。将名称链接到文件会增加链接计数,而取消链接会减少它。当链接计数下降到零时,那么该文件将不再在任何目录中被引用,被认为是“不需要的”,然后才可以删除。
因此,通过名称“删除”文件会取消其链接(因此系统调用的名称)- 也就是unlink,并且还有非常重要的ln命令来创建对文件(实际上是文件的inode)的其他链接,并使其以另一种方式被认识。

为了符合Posix标准,其他更新的操作系统和它们的文件系统必须模拟/遵守这种行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接