我正在玩用Python写文件:
import time
fo = open("foo.txt", "a+", 1)
while True:
fo.write("Some data to write");
time.sleep(.001)
如果我执行此代码,而不仅仅是手动删除“foo.txt”文件,该过程仍会在某处写入。
内容会怎样?该进程写入文件,但没有可用的文件。
答案 0 :(得分:2)
Michael The Linux Programming Interface
来自Michael Kerrisk
除了维护每个i节点的链接数之外,内核还会计算文件的打开文件描述(参见图5-2,第95页)。如果删除了文件的最后一个链接,并且任何进程都持有引用该文件的打开描述符,则在关闭所有描述符之前,实际上不会删除该文件。
您的脚本已打开文件,因此它包含一个引用该文件的打开描述符。系统不会在您通过使用rm
命令删除文件后立即删除该文件。但是在脚本关闭描述符后它会删除它。
我在man remove
:
remove()从文件系统中删除一个名称。它为文件调用unlink(2),为目录调用rmdir(2)。
如果删除的名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它所使用的空间可供重用。
如果名称是文件的最后一个链接,但任何进程仍然打开文件,则该文件将保持存在,直到引用它的最后一个文件描述符关闭。
就像@oglu在他的回答中提到的那样,这不是可移植的行为。在Windows上,您可以选择是否可以删除已打开的文件。
FILE_SHARE_DELETE(0x00000004)
在文件或设备上启用后续打开操作以请求删除访问权。
否则,如果其他进程请求删除访问权限,则无法打开文件或设备。
如果未指定此标志,但已打开文件或设备以进行删除访问,则该功能将失败。
注意删除访问权限允许删除和重命名操作。
答案 1 :(得分:1)
实际问题是在写入时更改文件描述符时会发生什么,这是特定于平台的。
如果您有POSIX系统,FD将保持打开状态,直到最后一个消费者关闭它为止,在这种情况下无法访问内容(该文件已经取消链接)。
如果你有一个Windows系统,我认为你在写文件时不能删除该文件(独家访问)。