概述
之前在一个项目中总是会出现设备突然断电后,某些文件成为0byte或者文件数据只写入一半的情况,
经过研究后发现该问题的复现操作为在写入文件时进行突然的断电或将程序kill,再追入其中发现这个问题
实质上与linux的文件系统有关,linux为了提升系统的运行速率设计了虚拟文件系统,该系统实际上并不会
立刻将你通过代码写入文件的数据写入磁盘,而是以一种缓冲区的方式先完成了写入数据的临时性存储,
完成这一步,linux的虚拟文件系统就会返回写入完成,但此时数据并未写入到磁盘,如果此时发生断电等
异常情况,就会出现开篇所述的问题,现将文件数据写入流程以及一些注意点记录如下:
文件数据的实际写入以及对应Func如下
fileWrite->usrCache: fwrite
usrCache->sysCache: fflush
sysCache->diskCache: fsync
diskCache->disk: barrier
- usrCache --> sysCache
- 应用程序write文件完成之后,
文件数据是暂存于USER CACHE,
利用FFLUSH,将USER CACHE