我想 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作品,它告诉OS刷新其缓冲区的物理介质。

操作系统很大程度上缓存你写一个文件的数据。如果操作系统执行每个写打的驱动器,事情会的非常的慢。 fsync(除其他外),可以控制当数据应该打的驱动器。

此外,FSYNC /提交上的文件描述符作品。它没有一个FILE*的知识,不能刷新其缓冲区。 FILE*生活在你的应用程序,文件描述符住在操作系统内核,一般。

其他提示

我可以说,为简单起见:

使用与fsync()不流文件(整数文件描述符)

使用与fflush()文件流。

另外这里是从人的帮助:

int fflush(FILE *stream); // flush a stream, FILE* type

int fsync(int fd); // synchronize a file's in-core state with storage device
                    // int type

fflush()fsync() 可用于尝试确保数据写入存储介质(但并不总是可行):

  1. 第一次使用 fflush(fp) 在输出流上(fp 成为一个 FILE * 从...获取 fopen 或标准流之一 stdout 或者 stderr) 将与流关联的缓冲区的内容写入操作系统。
  2. 然后使用 fsync(fileno(fp)) 告诉操作系统将自己的缓冲区写入存储介质。

但请注意 fileno()fsync() POSIX 函数可能并非在所有系统上都可用,尤其是 Microsoft 旧系统,其中可能会命名替代函数 _fileno(), _fsync() 或者 _commit()...

要强制的最近的变化到磁盘的承诺,使用同步()或FSYNC()函数。

<强> FSYNC() 将同步所有给定的文件的数据和元数据的与永久存储设备。它应该被称为相应的文件已被关闭之前发生。

<强> 同步() 将所有修改过的文件提交至磁盘。

我认为从下面蟒文件( https://docs.python.org/ 2 /库/ os.html )澄清很好。

  

os.fsync(FD)与文件描述符文件的力的fd写入到磁盘。上   Unix中,调用本地的fsync()函数;在Windows上,MS   _commit()函数。

     

如果你已经从一个Python文件对象f,首先做f.flush()   然后做os.fsync(f.fileno()),以确保所有的内部缓冲区   使用f相关联的写入磁盘。

     

状况:。Unix和Windows开始在2.2.3

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top