根据我的阅读,flush将数据推送到OS缓冲区并进行同步,确保数据下载到存储介质。因此,如果您想确保数据实际写入磁盘,则需要执行刷新,然后执行同步。那么,有没有你想要调用flush而不是同步的情况?
答案 0 :(得分:3)
答案 1 :(得分:1)
当您fflush
时,将一个文件的缓冲区刷新到磁盘(除非您给出NULL,在这种情况下它会刷新所有打开的文件)。 http://www.manpagez.com/man/3/fflush/
当您sync
时,将所有缓冲区刷新到磁盘。 http://www.manpagez.com/man/2/sync/
您应该注意的最重要的事情是fflush
是标准函数,而sync
是操作系统提供的系统调用(例如Linux)。
基本上,如果你正在编写可移植程序,实际上你从不使用sync
。
答案 2 :(得分:0)
是的,很多。大多数时候大多数程序都不会打扰任何各种同步操作;在关闭文件时将数据刷新到内核缓冲池就足够了。如果您使用的是日志文件系统,那么这是真的。
请注意,刷新是比read()
或类似系统调用更高级别的操作。它由C <stdio.h>
库或C ++ <iostream>
库使用。系统调用固有地将数据刷新到内核缓冲池(或者如果您使用直接I / O或类似的东西,则直接到磁盘)。
请注意,在类似POSIX的系统上,您可以通过在open()
系统调用(O_SYNC
,O_DSYNC
,{{1}上设置标记来安排数据同步等}),或随后通过O_RSYNC
。
答案 3 :(得分:0)
只是澄清一下,fflush()
仅在使用UNIX的FILE
接口时才适用,该接口在应用程序级别缓冲写入。如果使用正常的write()
来电,则fflush()
毫无意义。
话虽如此,我可以想到两种情况,你想呼叫fflush()
但不同步:
第二种情况是我见过的最常见的用法,如果printf()
调用没有以换行符('\ n')结尾,通常需要使用它。