perl - 取消链接究竟是如何工作的?

标签 perl file unix io

我很难理解这是如何工作的。

看来unlink()将删除引用文件数据的 inode,但实际上不会删除数据。如果是这种情况,

a) 数据会怎样?大概它不会永远存在,或者人们会一直用完磁盘空间。其他东西最终会在没有关联 inode 的情况下删除数据,还是什么?

b)如果数据没有发生任何事情:我怎样才能真正删除它?如果某些事情自动发生在它身上:我怎样才能在命令中发生这种情况?

(辅助问题:如果 shell 命令 rmunlink 基本上做同样的事情,正如我在这里读到的其他问题一样,而 Perl unlink 只是另一个调用,那么模块的意义何在像 File::Remove ,这似乎又做了同样的事情?我意识到“有不止一种方法可以做到这一点”,但这似乎是“不止一种说法”的情况,与“它”总是指相同的操作。)

简而言之:我可以确保删除文件实际上会立即释放其磁盘空间吗?

最佳答案

磁盘上的每个 inode 都有一个引用计数——它知道有多少地方引用它。目录条目是一个引用。可以存在对同一 inode 的多个引用。 unlink删除引用。当引用计数为零时,inode 不再使用,可能会被删除。这就是有多少东西可以工作,例如硬链接(hard link)和快照。

特别是 - 打开的文件句柄是一个引用。因此,您可以打开一个文件,取消链接,然后继续使用它——它只会在文件句柄关闭后才会被实际删除(前提是引用计数降至零,并且在其他任何地方都没有打开/硬链接(hard link))。

关于perl - 取消链接究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26487027/

相关文章:

c - 如何在 Linux 中使用 crypt() 方法?

linux - Unix返回电话号码,需要格式化

Perl foreach 循环遍历一个矩阵行

regex - 通过 Perl 更改文件名

java - 无法使用包含 '´' 和 'ñ' 字符的路径或文件名

java - 无法访问 res 文件夹?

perl - 我应该使用 Nmap::Parser 还是 Nmap::Scanner 来审计网络?

linux - 没有使用 Net::SFTP::Foreign 的非 root 连接

python - 如何在python中获取该行以及该行之前和该行之后的数据

linux - 珀尔 : background process not running because of print statement