2014-10-05 87 views
0

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

lsof +L1 

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

回答

1

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

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

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

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

1

我相信这是你想要的:

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

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

+0

作为一个旁注,谷歌浏览器使用了很多。在chrome'lsof + L1 |中打开多个选项卡grep Chrome | wc -l'表明Chrome创建了数百个临时文件...大概是为了减少内存使用量? – andyvanee 2014-10-05 04:37:59