删除文件,而另一个进程仍然写入它

时间:2015-01-18 11:14:26

标签: python file io

我正在玩用Python写文件:

import time

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

while True:
    fo.write("Some data to write"); 
    time.sleep(.001)

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

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

2 个答案:

答案 0 :(得分:2)

Michael The Linux Programming Interface来自Michael Kerrisk

  

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

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

我在man remove

中找到了man的参考资料
  

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

     

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

     

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

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

来自CreateFile function at MSDN

  

FILE_SHARE_DELETE(0x00000004)

     

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

     

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

     

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

     

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

答案 1 :(得分:1)

实际问题是在写入时更改文件描述符时会发生什么,这是特定于平台的。

如果您有POSIX系统,FD将保持打开状态,直到最后一个消费者关闭它为止,在这种情况下无法访问内容(该文件已经取消链接)。

如果你有一个Windows系统,我认为你在写文件时不能删除该文件(独家访问)。