fsync和syncfs有什么区别?
int syncfs(int fd);
int fsync(int fd);
fync的联机帮助页说明如下:
fsync()传输("刷新")所有修改后的内核数据(即修改后的缓冲区缓存页面) for)文件描述符fd引用的文件到磁盘设备(或其他永久存储器) 年龄设备),以便即使在系统崩溃或之后也可以检索所有更改的信息 重启了。这包括写入或刷新磁盘高速缓存(如果存在)。电话 阻止,直到设备报告传输已完成。它还会刷新元数据 与文件相关的信息(见统计数据(2))。
syncfs的联机帮助页说明如下:
sync()导致对文件元数据和数据的所有缓冲修改都写入底层 - 文件系统。
syncfs()与sync()类似,但只同步包含文件系统的文件系统 打开文件描述符fd。
对我而言,两者似乎都是平等的。它们正在同步filedescriptor引用的文件和关联的元数据。
答案 0 :(得分:6)
首先,fsync()
(和sync()
)是POSIX标准函数,而syncfs()
仅限Linux。
因此可用性是一个很大的区别。
fsync()
函数将请求打开文件的所有数据 由fildes
命名的描述符将被传输到存储 与fildes
描述的文件关联的设备。的性质 转移是实施定义的。fsync()
函数应该 在系统完成该操作或直到系统完成之前不会返回 检测到错误。
请注意,这只是一个请求。
来自the POSIX standard for sync()
:
sync()
函数将导致内存中的所有信息 更新文件系统计划写入输出到所有文件 系统写作虽然已经预定,但未必完成 从
sync()
返回。
同样,这不是保证会发生的事情。
The Linux man page for syncfs()
(and sync()
) states
sync()
导致对文件系统元数据的所有待定修改 要写入底层文件系统的缓存文件数据。
syncfs()
与sync()
类似,但只是同步文件系统 包含由打开文件描述符fd
引用的文件。
请注意,函数返回时未指定。
The Linux man page for fsync()
states:
fsync()
转移("刷新")所有修改后的核心内数据(即 已修改的缓冲区缓存页面)文件引用的文件 描述符fd
到磁盘设备(或其他永久存储设备) 这样即使系统也可以检索所有已更改的信息 崩溃或重新启动。这包括写作或冲洗 磁盘缓存(如果存在)呼叫将阻塞,直到设备报告该情况 转移已经完成。除了刷新文件数据外,
fsync()
还会刷新元数据 与文件关联的信息(参见inode(7))。调用
fsync()
并不一定能确保该条目 包含该文件的目录也已到达磁盘。对于那个 目录的文件描述符上的显式fsync()
也是 需要的。
请注意,Linux为fsync()
提供的保证比为sync()
或syncfs()
提供的保证要强得多,而fsync()
和sync()
提供的保证要强得多
总结:
fsync()
:"请将此文件的数据写入磁盘" sync()
:"当您接触到它时,将所有数据写入磁盘" sync()
:"将所有数据写入磁盘(当你接触它时?)" syncfs()
:"将与此文件关联的文件系统的所有数据写入磁盘(当你接触它时?)" fsync()
:"将此文件的所有数据和元数据写入磁盘,并且在您执行之前不要返回" 请注意,Linux手册页未指定sync()
和syncfs()
何时返回。
答案 1 :(得分:0)
我认为当前答案还不完整。对于Linux:
根据标准规范(例如POSIX.1-2001),
--release
安排写入,但可能在实际写入之前返回 完成。但是,Linux等待I / O完成,因此sync()
或sync()
提供与每个文件上调用的syncfs()
相同的保证 分别在系统或文件系统中。
和
在1.3.20版之前,Linux并未在I / O完成之前等待 返回。
sync(2)
page的“注释”和“错误”部分中对此进行了提及。