微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sync()/fsync() 和 std::ofstream.flush() 之间的功能区别是什么?

如何解决sync()/fsync() 和 std::ofstream.flush() 之间的功能区别是什么?

背景:我有生以来第一次使用 VxWorks,我必须翻译一些继承的代码才能在 VxWorks 中工作。

问题和解决方案:代码调用sync()。 VxWorks 头文件中没有对 sync() 的定义(至少,不是我所拥有的)。我有 fsync(),它需要一个文件描述符才能工作。调用 sync() 的函数调用 sync 之前使用 ofstream 对象写入文件...并且没有明显的方法可以从 ofstream 对象中恢复文件描述符。

经过令人尴尬的长时间寻找选项后,我发现了 ofstream::flush() 函数,它应该适合我正在尝试做的事情。

但是,在我的 root 中,有人向我指出 ofstream::flush() 和 sync/fsync 与不同的事物(分别为 IIUC、C 库和操作系统)相关联。这表明 ofstream::flush() 不会实现完全与 sync() 或 fsync() 相同的东西。

有人可以为我列出不同之处吗?我的理解还是太模糊了,以后不能依赖了。


后续:原始代码将 std::endl 附加到流调用同步。我的理解是附加 endl 会产生flush()的效果。如果原始代码两者都有,那向我建议

  1. 代码是多余的
  2. flush() 和 sync()/fsync() 都是必需的,因为它们做类似但不完全相同的事情。

是哪个?

解决方法

如果您知道用于文件系统的设备名称,则很容易开发一个可以在该设备上执行 sync() 操作的存根函数:

fd = open(...);
fsync(fd);
close(fd);

理想情况下,代码可以通过传递命令 FIOFLUSHFIOSYNC 将所有打开的 fd 解析到文件系统并执行 ioctl() 操作>.

例如:

status = ioctl(fd,FIOSYNC,0); /* see definition in ioLib.h */

您可以查看用于遍历所有文件描述符的 iosFdShow() 代码。

,

flush() 刷新应用程序级缓冲区。也就是说,它确保使用 write 写入所有数据。

sync() 是一个系统调用,它使操作系统将其文件缓存与底层存储同步。换句话说,如果您想确保将文件写入磁盘而不只是在内存中的某个页面上,您可以调用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。