fwrite、fflush、fsync和setvbuf调用关系 - 简书 (jianshu.com)
当fwrite数据超过buffer大小,就会自动刷新到内核缓存,如果希望立刻刷新,就可以调用fflush。
此时内核缓存的数据并没有立刻同步到磁盘中去,会等待一个IO同步周期,然后同步到磁盘中去,比如在android设备中,同步周期为5秒钟左右,如果开发音视频录制功能,在同步周期到来之前发生掉电或程序Crash,则会发生数据丢失的问题,即使APP已经调用了fwrite。
如果希望内核缓存立刻同步到磁盘,可以调用fsync来强制系统执行IO同步,这个方法是阻塞方法,需要等待IO同步到磁盘完成后才会返回,所以需要注意调用的线程是否可以执行耗时的操作。
关系如下:
app --------fwrite------> c库缓冲-----fflush--------->内核缓冲--------fsync----->磁盘
作者:__now
链接:https://www.jianshu.com/p/6f3ac6cfeaf3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。