使用c ++ ofstreams将文件写入或刷新到异步NFS

时间:2014-10-22 19:32:31

标签: c++ asynchronous nfs ofstream

我们有一个项目,多个节点按顺序将数据写入文件,文件驻留在NFS上。

我们之前使用的是同步NFS,因此刷新文件流工作正常。现在我们有异步NFS,它不起作用。在某种意义上不起作用显然缓存进入了画面,其他节点没有看到特定节点所做的更改。

我想知道是否有办法强制将数据从缓存刷新到磁盘。我知道这样做效率不高,但在我们得到真正的解决方案之前,它会让事情发挥作用。

1 个答案:

答案 0 :(得分:0)

我在使用NFS和VxWorks时遇到了类似的问题。经过一些实验,我找到了一种确保将数据刷新到设备的方法:

int fd;
fd = open("/ata0a/test.dat", O_RDWR | O_CREATE);
write(fd, "Hallo", 5);
/* data is having a great time in some buffers... */
ioctl(fd, FIOSYNC, 0);   // <-- may last quite a while...
/* data is flushed to file */

我从未使用过ofstreams,我也不知道你的操作系统是否提供了与上面显示的代码类似的内容......

但要尝试的一件事就是关闭文件。这将导致刷新所有缓冲区。但请注意,在关闭文件和刷新所有数据之间可能需要一些时间,因为“关闭”调用可能会在写入数据之前返回。此外,这会产生大量开销,因为您之后必须重新打开文件。

如果这不是选项,您还可以在数据之后写入尽可能多的“虚拟数据”,以使缓冲区填满。这也将导致数据被写入文件。但这可能会浪费大量磁盘空间,具体取决于数据的大小。