最近做保存数据到文件操作,有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来把数据真正写入硬盘。