Linux系统中fflush,sync,syncfs,fdatasync,fsync的比较

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

fflush 是 C 标准库提供的函数,对输入输出流起作用,起作用的是C标准库管理的用户空间文件缓存。对输出流来说,会使用系统提供的写文件系统调用(write)把标准库缓存的数据写入文件,fflush并不能保证数据真正的写入文件系统。对输入流来说,会把从可寻址的文件读入标准库缓存的数据给清洗掉。

#include <unistd.h>
void sync(void);
int syncfs(int fd);

sync 和 syncfs 起作用的是文件系统缓存,这些缓存是在内核空间管理的。sync 会把对文件系统的元数据、缓存的文件数据写入所有底层的文件,对所有文件系统有用。syncfs 需要一个文件描述符,只写入文件描述符指向的文件所在的文件系统上的数据。有时候突然拔掉优盘,里面的文件会损坏,就是因为优盘上文件的更改没有从内核文件缓存写入优盘所导致的。

在linux系统上,sync 和 syncfs 都是阻塞的,会确保数据写入底层的文件系统。但是在POSIX标准里,sync可能在数据写入之前返回。

#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);

fsync 把文件描述符fd指向的文件缓存在内核中的所有已修改的数据写入文件系统,包含数据与文件元数据(文件大小,文件修改时间等)。但是fsync不会写入对指向文件的目录项的修改,也就是说如果新创建了一个文件,要是确保下次能正确读出的话,就需要把所在目录也fsync一下。

fdatasync 把和fsync作用差不多,但是不会写入对下次正确读取文件作用不大的一些元数据(比如上次访问时间,上次修改时间等),但是大小如果改变了,是会写进去的。

这两个系统调用被调用后会阻塞,直到设备报告所有数据都已写入(设备可能本身也有缓存)。

转载于:https://www.cnblogs.com/kercker/p/8610988.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值