在另一个进程仍在写入文件时删除文件

use*_*744 3 python io file

我正在尝试使用 Python 写入文件:

import time

fo = open("foo.txt", "a+", 1)

while True:
    fo.write("Some data to write"); 
    time.sleep(.001)
Run Code Online (Sandbox Code Playgroud)

如果我执行此代码,而不仅仅是手动删除“foo.txt”文件,该进程仍会在某处写入。

内容会怎样?进程写入文件,但没有文件可用。

lua*_*kow 5

来自The Linux Programming Interface迈克尔·凯里斯

除了维护每个索引节点的链接计数外,内核还计算文件的打开文件描述(参见第 95 页的图 5-2)。如果文件的最后一个链接被删除并且任何进程持有引用该文件的打开描述符,则在所有描述符都关闭之前,该文件实际上不会被删除。

您的脚本已打开该文件,因此它保存了一个指向该文件的打开描述符。系统不会在您通过即使用rm命令删除文件后立即删除文件。但它会在您的脚本关闭描述符后删除它。

我在 man 中找到了参考,来自man remove

remove() 从文件系统中删除一个名称。它为文件调用 unlink(2),为目录调用 rmdir(2)。

如果删除的名称是指向文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它所使用的空间可以重新使用。

如果名称是文件的最后一个链接,但任何进程仍然打开该文件,则该文件将一直存在,直到最后一个引用它的文件描述符关闭。

正如@oglu 在他的回答中提到的那样,这不是可移植的行为。在 Windows 上,您可以选择是否可以删除您打开的文件。

来自MSDN 的 CreateFile 函数

FILE_SHARE_DELETE (0x00000004)

启用对文件或设备的后续打开操作以请求删除访问权限。

否则,如果其他进程请求删除访问权限,它们将无法打开文件或设备。

如果未指定此标志,但已打开文件或设备进行删除访问,则该功能失败。

注意删除访问允许删除和重命名操作。