0

我对如何删除(删除)文件但仍被进程链接并仍被写入文件感到困惑。我的理解是文件名是目录中指向inode的条目。inode 是一种数据结构,它列出了构成文件的逻辑块。当一个文件被删除时,它的目录条目被删除,但数据和 inode 保持不变。内核检查是否有其他指向该 inode 的链接,如果没有,则删除该 inode 并回收内存。但是这样一个无名的文件是怎么产生的呢?每当我在 python 中打开一个文件并读取或写入它时,它都存在于磁盘上。但是当我在我的 Mac 上发出这个命令时:

lsof +L1

我得到一个包含 300 个文件的列表!根据我的阅读,这些文件只有一个链接,即写入它们的进程的链接。如果这些文件也有目录条目,那么至少会有两个链接。那么,在此过程中,写入这些文件的进程删除了它们的目录条目?为什么?如何?

4

2 回答 2

2

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

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

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

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

于 2014-10-05T03:58:50.630 回答
1

我相信这是你感兴趣的:

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

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

于 2014-10-05T04:29:42.720 回答