fsync(fd)是否适用于外部程序创建的文件?

STe*_*yaK 5 linux fsync sata ext4

我有一个禁用写入缓存的SATA硬盘:

hdparm -W0 /dev/foo
Run Code Online (Sandbox Code Playgroud)

我正在ext4使用这些挂载选项(以及其他)的分区上运行:

data=ordered
auto_da_alloc
Run Code Online (Sandbox Code Playgroud)

Linux内核版本是2.6.32-5-686.

现在,我有一个我无法修改的外部程序,但我知道以下列方式创建一个文件:

int fd = open(path);
write(fd, data, data_size);
close(fd);
Run Code Online (Sandbox Code Playgroud)

即它在关闭之前不会fsync.所以在这一点上,数据可能在RAM中,在kernel/fs缓存中的某个地方.

注意:元数据还不是一个问题:我确保数据已经到达磁盘盘片之后,最终的元数据将被写入并保存.数据本身就是问题所在.

所以问题是,我如何帮助数据到达实际的磁盘盘片?

我之后想过运行这个单独的程序:

int fd = open(path);
fsync(fd);
close(fd);
Run Code Online (Sandbox Code Playgroud)

这有助于刷新数据,还是应该使用不同的方法?

nos*_*nos 1

这会有助于刷新数据吗?

是的,会的,谁进行 fsync 并不重要。

请注意,您可能也希望同步文件所在的目录,以便同步文件的元数据。