我认为 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/