【发布时间】:2011-01-21 09:18:39
【问题描述】:
我认为fsync() 在内部执行fflush(),所以在流上使用fsync() 是可以的。但是在网络 I/O 下执行时,我得到了一个意想不到的结果。
我的代码sn-p:
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() 做同样的事情。有输入吗?
【问题讨论】:
-
您在第一个示例中看到的问题是什么?
-
@rogerdpack 在第一个示例中,即使在 fd(文件描述符)上调用 _commit() 函数,通过 fputs() 写入流也不会同步/提交到磁盘。该测试是在集群系统下完成的,其中远程 linux 文件系统导出为 CIFS 并在 Windows 机器上使用,并且在写入期间测试节点故障转移。当节点恢复时,发现文件大小为零。
-
#endif在哪里? -
该问题在内部是一致的,并且在修订 #5 之前的答案也与之一致,这从根本上改变了问题的性质。回滚到修订版 #4。