我想fsync()
does 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
在较低级别上工作,它告诉操作系统将其缓冲区刷新到物理介质。
操作系统大量缓存写入文件的数据。如果操作系统强制每次写入都命中驱动器,那么情况会是这样very slow. fsync
(除其他外)允许您控制数据何时到达驱动器。
此外,fsync/commit 适用于文件描述符。它不知道FILE*
并且无法刷新其缓冲区。FILE*
文件描述符通常存在于您的应用程序中,而文件描述符则存在于操作系统内核中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)