Zenghui Bao's World

about life, programming, misc thoughts.

[转] fflush与fsync的区别

转自: http://blog.xiaoheshang.info/?p=274

1 来源

fflush为C标准库函数, fsync为系统函数。

	#include <stdio.h>
	int fflush(FILE *stream);
	#include <unistd.h>
	int fsync(int fd);

2 参数

fflush的参数为FILE*,fsync为文件描述符。

3 功能

fflush: 把C标准库中的缓冲写到内核缓冲区 fsync: 将内核缓冲区的内容写入磁盘,所有的内容写入磁盘后才返回。
C库缓冲区–fflush–>内核缓冲区–fsync–>磁盘

问:为什么要有个内核缓冲区,以前要实时写到磁盘我都是直接调用的fflush,好像没出现过问题啊?
答:一般不会有问题,程序退出时,系统会将系统缓冲区的内容写到磁盘上。如果fflush之后突然断电,那么数据就可能丢失。
fflush(fp); fsync(fileno(fp));可以保证数据完全写入磁盘。