流程退出后需要文件刷新吗?

时间:2014-08-19 11:37:27

标签: python linux ext4

我正在使用openwrite从一个进程编写文件(即直接内核调用。)写完后,我只需close并退出应用程序而不进行刷新。现在,应用程序从Python-Wrapper启动,在应用程序退出后立即读取文件。然而,有时候,Python包装器会读取不正确的数据,好像我还在读取旧版本的文件(即包装器读取陈旧数据)

我认为无论文件元数据和内容是否写入磁盘,用户可见内容始终有效&一致(即缓冲区至少被刷新到内存中,因此后续读取会获得相同的内容,即使它可能没有提交到磁盘。)这里发生了什么?我是否需要在我的应用程序中同步关闭;或者我可以在从Python脚本运行我的应用程序后发出sync命令,以保证所有内容都已正确写入?这是在ext4上运行。

在Python方面:

# Called for lots of files
o = subprocess.check_output (['./App.BitPacker', inputFile]) # Writes indices.bin and dict.bin
indices = open ('indices.bin', 'rb').read ()
dictionary = open ('dict.bin', 'rb').read ()

with open ('output-file', 'wb') as output:
    output.write (dictionary) # Invalid content in output-file ...
    # output-file is a placeholder, one output-file per inputFile or course

1 个答案:

答案 0 :(得分:1)

我从来没有遇到过你的问题,并且总是发现对close()的调用就足够了。然而,从关闭(2)的男人入口:

  

成功关闭并不能保证数据已成功保存到磁盘,因为内核会延迟写入。当流关闭时,文件系统刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用fsync(2)。 (这取决于此时的磁盘硬件。)

因为在撰写本文时,您还没有包含写入过程的代码,我只能建议在该过程中添加对fsync的调用,看看是否会产生影响。