fflush - fflush 和 fsync 的区别

标签 fflush fsync c windows

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

我的代码片段:

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 导出的文件系统上)。

当我将代码更改为:

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() 做同样的事情。有什么意见吗?

最佳答案

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

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

操作系统大量缓存您写入文件的数据。如果操作系统强制每次写入都命中驱动器,那么事情将非常缓慢。 fsync(除其他事项外)允许您控制数据何时到达驱动器。

此外,fsync/commit 作用于文件描述符。它不知道 FILE* 并且无法刷新其缓冲区。 FILE* 存在于您的应用程序中,文件描述符通常存在于操作系统内核中。

关于fflush - fflush 和 fsync 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2340610/

相关文章:

使用 fflush 的时钟不清除屏幕

c - 为什么输出的执行顺序不符合预期

c - 这是缓冲区溢出吗?

linux - 在多个文件和一个文件上调用 fsync 时的性能

c - 使用指针数组对一个列表进行两种排序

c - 标记化数组 : signal SIGABRT error 上的 realloc()

c - Fflush 不写入缓冲文本

linux-kernel - fsync/FlushFileBuffers 是否等待未完成的异步 IO 完成?

linux - 可以在每次提交时使用单个 fsync 来实现日志记录吗?

c - 如何为使用第三方库的 C 程序设置成熟的构建过程(APR - Apache Portability Runtime)