我可以使用代码从目录中删除文件但不删除其inode吗?

时间:2014-10-05 03:41:29

标签: python macos directory inode lsof

我很困惑如何删除(删除)文件,但仍然可以通过进程链接并仍然可以写入。我的理解是文件名是目录中指向inode的条目。 inode是一种数据结构,列出组成文件的逻辑块。删除文件时,将删除其目录条目,但不会触及数据和inode。内核检查是否有到inode的任何其他链接,如果没有,则删除inode并回收内存。但是如何创建这样一个无名文件呢?每当我打开一个文件并在python中读取或写入它时,它就存在于磁盘上。但是当我在我的mac上发出这个命令时:

lsof +L1

我得到300个文件的列表!从我读过的内容来看,这些文件只有一个链接,即写入过程的过程。如果这些文件也有目录条目,则至少会有两个链接。那么,在某个地方,写入这些文件的进程,删除了他们的目录条目?为什么?怎么样?

2 个答案:

答案 0 :(得分:1)

打开文件,然后取消链接。现在你有一个打开文件描述符到一个目录中没有链接的文件。

取消链接文件可以使用unlink()系统调用以编程方式完成。从命令行,可以使用命令rmunlink。这些实际上只是一种调用unlink()系统调用的方法。

lsof可能会出现很多这样的文件描述符,因为某些程序打开了一个文件然后其他程序替换了该文件。有几种方法可以写出文件。您可以打开现有文件,截断其内容,然后编写新内容。您可以取消链接文件,然后打开/创建新文件并编写新内容。或者您可以写入单独的文件,原子地交换两个目录条目以将新文件放在旧文件的位置,然后取消链接旧文件(即使用rename()exchangedata()系统调用)。后两种方法将使任何已经打开的文件描述符指向旧文件的inode,即使它不再从目录链接。

例如,在我的系统lsof上显示许多描述符对/private/var/folders/.../mds/mdsDirectory.db打开。这可能与Spotlight有关。磁盘上有该文件的一个版本,但没有相同的inode。所以,可能是在时间t0打开它的东西,其他东西在时间t1写了一个新版本并取消了旧版本的链接,我在时间t2检查了。

答案 1 :(得分:1)

我相信这是你感兴趣的:

https://docs.python.org/2/library/os.html#os.tmpfile

  

该文件没有与之关联的目录条目,并且一旦没有该文件的文件描述符,将自动删除。