当前位置: 首页 > 工具软件 > fsync > 使用案例 >

fsync fflush 相关

屈昊天
2023-12-01

最近做保存数据到文件操作,有2个数据,一个是视频,一个是小数据,一样的操作函数,保存视频没有问题,但保存数据就不行,仔细查看,

保存视频数据时,由于视频数据都比较大,我每收到64kB保存一次,没有问题,

问题就出现 在保存信息数据上,这个数据量比较小,一秒10B,我不可能收到64KB再保存,于是 我就想着fsync同步一下,

void test_file_wr()
{
    FILE *    g_fd;
    const    uint8_t dat[10]={0,1,2,3,4,5,6,7,8,9};
    g_fd = fopen("test.idx", "ab");
    fwrite(dat, 1, 10, g_fd);
    fsync(g_fd);
}

上面的程序,实际是不行的,虽然写数据成功,同步数据也成功,但是数据根本没有保存到磁盘里,

要想真正保存到磁盘里,在加fflush(),就可以了,

void test_file_wr()
{
    FILE *    g_fd;
    const    uint8_t dat[10]={0,1,2,3,4,5,6,7,8,9};
    g_fd = fopen("test.idx", "ab");
    fwrite(dat, 1, 10, g_fd);

    fflush(g_fd);
    fsync(g_fd);
}

我的理解+解释:fflush把内核中的数据 清到stream中, fsync把文件属性更新, 如果stream流中没有数据,则只调用fsync是不起作用的。事实也证明了这一点。

fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。fsync:是把内核缓冲刷到磁盘上。 
fsync 将文件相关的所有更改都发送到disk device。 这个调用是阻塞的,直到disk通知此函数传输完成。此函数也会将该文件的文件信息flush到disk。

仅仅是把上层缓冲区中的数据刷新到内核缓冲区就返回,因此相对于fsync而言不是很安全,还需要再调用一下fsync来把数据真正写入硬盘。

 

 类似资料: