unix - unlink 和 rm 在 unix 上的区别

标签 unix ubuntu system delete-file unlink

这两个命令之间的真正区别是什么?为什么系统调用删除一个名为unlink的文件而不是 delete ?

最佳答案

您需要对原始 Unix 文件系统有所了解才能理解这个非常重要的问题。

与那个时代(60 年代末、70 年代初)的其他操作系统不同,Unix 没有将文件名与实际目录信息(文件在磁盘上的存储位置)一起存储。相反,Unix 创建了一个单独的“inode table "包含目录信息,并识别实际文件,然后允许单独的文本文件成为名称和 inode 的目录。最初,目录文件旨在像所有其他文件一样作为纯文本文件进行操作,使用 shell 程序员至今熟悉的相同工具(cat、cut、sed 等)。

这一架构决定的一个重要结果是单个文件可以有多个名称!特定目录文件中每次出现的 inode 本质上都是 链接 到inode,所以它是已知的。要将文件名连接到文件的 inode(“实际”文件),您“链接”它,当您从目录中删除名称时,您“取消链接”它。

当然,取消链接文件名并不意味着您正在从磁盘中删除/删除该文件,因为该文件可能仍以其他目录中的其他名称为人所知。 Inode 表还包括一个 链接数跟踪一个 inode(文件)已知的名称;将名称链接到文件会使链接计数增加一,取消链接则会删除一。当链接计数下降到零时,该文件不再在任何目录中被引用,假定为“不需要的”,只有这样才能将其删除。

出于这个原因,通过名称“删除”文件会取消链接 - 因此是系统调用的名称 - 还有非常重要的 ln 命令创建一个指向文件的附加链接(实际上是文件的 inode),并以另一种方式知道它。

其他较新的操作系统及其文件系统必须模拟/尊重此行为以符合 Posix 标准。

关于unix - unlink 和 rm 在 unix 上的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23977933/

相关文章:

bash - 如何避免需要创建一个临时文件来从 bash shell 运行两个命令?

php - 如何设置 cron 以在 Ubuntu 的 localhost 上运行 PHP 文件?

bash - 在 Ubuntu 启动时运行挂载脚本

php - 使用 UTF-8 进行 PHP 系统调用 Python

c++ - 简单的 Http 获取响应

json - Bash,管道解析和格式化 json(瘦身)

c - sockaddr 和 IPv6 地址

eclipse - Ubuntu 12.04 中没有用于 Eclipse Juno 的 HTTP 预览服务器

java - 为什么第一个方法调用总是耗时最长?

linux - Node JS - 监听系统事件