gpt4 book ai didi

fflush - fflush 和 fsync 的区别

转载 作者:可可西里 更新时间:2023-11-01 11:57:15 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com