操作系统: ubuntu 20.04.5 LTS,
内核版本:5.1.120-rt70
硬件平台:arm64
问题现象:使用C++ ofstream文件输出流写内容到制定文件。代码如下所示:
1 #include <fstream>
2 #include <iostream>
3 ...
4 std::ofstream fs;
5 std::string filename{"test.txt"}
6 int32_t value = 0;
7 fs.open(file_name);
8 if (fs.is_open()) {
9 fs << value;
10 fs.close();
11 }
运行以上代码段后直接重启机器,会发现已经创建好了test.txt文件,但是文件内容是空的,这说明我们及时将文件对象正常关闭,真正的文件内容并不能及时保存到磁盘。
因为业务上依赖于test.txt文件内容。为了保证数据不丢失,在L9到L10之间尝试增加数据流flush()操作,在L10文件close之后增加延时(20s)让系统自动保存。经过一些列努力,文件内容还是没有被保存进磁盘,文件系统在关机中丢失了数据。
进一步考虑使用系统调用sync,但是也没有很好的将数据保存下来。
最后使用更加底层的C函数fsync(), 他可以很好的将数据刷到磁盘。