进程退出后需要刷新文件吗?
我在一个进程中使用 open
和 write
来写文件(也就是直接调用内核的功能)。写完之后,我只是 close
关闭文件,然后退出应用程序,没有进行刷新。现在,这个应用程序是通过一个 Python 包装器启动的,而在应用程序退出后,包装器会立即读取这些文件。然而,有时候,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 个回答
1
我从来没有遇到过你说的问题,通常调用close()就足够了。不过,根据close(2)的手册说明:
成功调用close并不意味着数据已经成功保存到硬盘,因为操作系统可能会延迟写入数据。通常情况下,文件系统在关闭流时不会立即刷新缓存。如果你想确保数据真的存储到了硬盘上,可以使用fsync(2)这个函数。(这还取决于硬盘的硬件情况。)
因为在你提问时,你没有提供写入过程的代码,所以我只能建议你在这个过程中添加一个fsync的调用,看看这样是否会有所改善。