首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fflush和fsync之间的区别

fflush和fsync之间的区别
EN

Stack Overflow用户
提问于 2010-02-26 17:36:11
回答 6查看 51.2K关注 0票数 66

我认为fsync()在内部做了fflush(),所以在流上使用fsync()是可以的。但在网络I/O下执行时,我得到了意想不到的结果。

我的代码片段:

代码语言:javascript
复制
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* get fd of the FILE pointer */
fd = fileno(fp);
#ifndef WIN32
ret = fsync(fd);
#else
ret = _commit(fd);
fclose(fp);

_commit()似乎没有刷新数据(我在Windows上尝试过,数据是写入Linux导出的文件系统上的)。

当我将代码更改为:

代码语言:javascript
复制
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);   
...   
...
fputs(buf.c_str(), fp);
/* fflush the data */
fflush(fp);
fclose(fp);

它会刷新数据。

我想知道_commit()是否和fflush()做了同样的事情。有什么建议吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-26 17:41:01

fflush()FILE*上工作,它只是将应用程序的FILE*中的内部缓冲区刷新到操作系统中。

fsync在较低的级别上工作,它告诉操作系统将其缓冲区刷新到物理介质。

OSs会大量缓存您写入文件的数据。如果操作系统强制每次写入都命中驱动器,则速度会非常慢。fsync (除其他功能外)允许您控制数据何时应命中驱动器。

此外,fsync/commit在文件描述符上工作。它不知道FILE*,也不能刷新它的缓冲区。通常,FILE*驻留在您的应用程序中,文件描述符驻留在OS内核中。

票数 101
EN

Stack Overflow用户

发布于 2017-01-12 22:03:39

标准C函数fflush()和POSIX系统调用fsync()在概念上有些相似。fflush()操作C文件流(FILE对象),因此是可移植的。fsync()对POSIX文件描述符进行操作。两者都会导致将缓冲的数据发送到目的地。

在POSIX系统上,每个C文件流has an associated file descriptor和C文件流上的所有操作都将通过在必要时委托对文件描述符进行操作的POSIX系统调用来实现。

有人可能认为,在POSIX系统上调用fflush会导致对文件流缓冲区中的任何数据执行write,然后调用fsync()来获取该文件流的文件描述符。因此,在POSIX系统上,不需要在调用fflush之后再调用fsync(fileno(fp))。但事实是这样的吗:fflush是否调用了fsync

不,在POSIX系统上调用fflush并不意味着将调用fsync

fflush的C标准说(强调添加了)它

会导致要传送到主机环境的流的任何未写入数据都将写入文件

说要写入数据,而不是写入数据,意味着允许主机环境进行进一步的缓冲。对于POSIX环境,“主机环境”的缓冲可以包括fsync刷新的内部缓冲。因此,仔细阅读C标准就会发现,该标准并不要求POSIX实现调用fsync

作为extension of the C semanticsPOSIX standard description of fflush不会声明调用了fsync

票数 9
EN

Stack Overflow用户

发布于 2015-02-04 23:29:07

为了简单起见,我可以这么说:

对非流式文件(整数文件描述符)使用fsync()

对文件流使用fflush()

这里还有来自人类的帮助:

代码语言:javascript
复制
int fflush(FILE *stream); // flush a stream, FILE* type

int fsync(int fd); // synchronize a file's in-core state with storage device
                    // int type
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2340610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档