我正在使用open
和write
(即直接内核调用)从一个进程中写入文件。写完之后,我简单地close
退出了应用程序而没有刷新。现在,从Python包装程序启动应用程序,该应用程序退出后立即读取文件。但是有时,Python包装器读取了不正确的数据,好像我仍在读取文件的旧版本一样(即包装器读取了陈旧的数据)
我认为无论文件元数据和内容是否写入磁盘,用户可见的内容将始终有效且一致(即,缓冲区至少刷新到内存,因此后续读取将获得相同的内容,即使可能不会已提交到磁盘。)这是怎么回事?我是否需要在应用程序中关闭时进行同步?还是可以sync
在从Python脚本运行应用程序之后简单地发出命令以确保一切都已正确编写?它在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
我从未遇到过您的问题,并且总是发现对close()的调用就足够了。但是,在close(2)上的man条目中:
成功关闭并不能保证已将数据成功保存到磁盘,因为内核延迟写入操作。当关闭流时,文件系统不经常刷新缓冲区。如果需要确保物理存储数据,请使用fsync(2)。(这将取决于磁盘硬件。)
因为在撰写本文时,您还没有包含用于写入过程的代码,所以我只能建议在该过程中添加对fsync的调用,看看这是否有所作为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句