unlink是如何工作的?

时间:2014-10-21 12:42:21

标签: perl file unix io

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

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

a)数据会发生什么变化?据推测,它不会永远存在,或者人们会一直耗尽磁盘空间。是否有其他东西最终会在没有关联的inode的情况下删除数据,或者是什么?

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

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

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

3 个答案:

答案 0 :(得分:10)

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

特别是 - 打开文件句柄是一个参考。因此,您可以打开一个文件,取消链接并继续使用它 - 只有在文件句柄关闭后才会被删除(如果引用计数降为零,并且它在其他任何地方都没有打开/硬连接)。

答案 1 :(得分:2)

unlink()将数据(由inode引用)中的链接(如果需要,但在技术上是某个目录文件中的记录)删除。一旦没有更多数据链接,系统将自动释放相关空间。到inode的链接数被跟踪到inode。您可以使用ls -l观察到文件的实际链接数,例如:

789994 drwxr-xr-x+  29 john  staff      986 11 nov  2010 SCANS
 23453 -rw-r--r--+   1 erik  staff      460 19 mar  2011 SQL.java

这意味着inode 789994有29个链接,而inode 23453只有1个。 SQL.java是指向inode 23453的当前目录的一个条目,如果从目录中删除该记录(系统调用unlink或命令rm),则计数结束到0并且系统释放相应的空间,因为如果计数为0则这意味着没有更多的链接/名称来访问数据!所以它可以被释放。

答案 2 :(得分:1)

删除链接只是意味着不再为某个文件名保留空间。当其他东西分配给该空间时,数据将被删除/销毁。这就是人们在删除财务记录等敏感数据后将零或随机数据写入驱动器的原因。

相关问题