【问题标题】:flush without sync不同步刷新
【发布时间】:2011-11-19 12:18:24
【问题描述】:

根据我的阅读,刷新将数据推送到操作系统缓冲区,同步确保数据向下传输到存储介质。因此,如果您想确保数据实际写入磁盘,则需要先进行刷新,然后再进行同步。那么,在任何情况下您都想调用flush而不是sync?

【问题讨论】:

  • 您希望何时能够释放缓冲区?
  • 一个小建议:您可以使用write 系统调用,而不是每次都调用write,它会进行无缓冲写入(直接写入操作系统缓冲区)。如有必要,这只需要您致电sync

标签: c file operating-system


【解决方案1】:

是的,很多。大多数程序大部分时间都不会费心调用任何各种同步操作。关闭文件时将数据刷新到内核缓冲池中就足够了。如果您使用的是日志文件系统,则更是如此。

请注意,刷新是比read() 或类似系统调用更高级别的操作。它由 C <stdio.h> 库或 C++ <iostream> 库使用。系统调用固有地将数据刷新到内核缓冲池(如果您使用直接 I/O 或类似的东西,则直接刷新到磁盘)。

还要注意,在类似 POSIX 的系统上,您可以通过在open() 系统调用(O_SYNCO_DSYNCO_RSYNC)或随后通过@987654329 设置标志来安排数据同步等@。

【讨论】:

    【解决方案2】:

    当你fflush 时,你将一个文件的缓冲区刷新到磁盘(除非你给 NULL,在这种情况下它会刷新所有打开的文件)。 http://www.manpagez.com/man/3/fflush/

    sync 时,会将所有缓冲区刷新到磁盘。 http://www.manpagez.com/man/2/sync/

    您应该注意的最重要的一点是fflush 是标准函数,而sync 是操作系统(例如Linux)提供的系统调用。

    所以基本上,如果你正在编写可移植程序,你实际上从不使用sync

    【讨论】:

      【解决方案3】:

      澄清一下,fflush() 仅在使用 UNIX 的 FILE 接口时适用,该接口在应用程序级别缓冲写入。如果使用普通的write() 调用,fflush() 就没有意义了。

      话虽如此,我可以想到两种情况,您想拨打fflush()但不同步:

      1. 您希望确保即使应用程序崩溃,数据最终也会写入磁盘。
      2. 强制筛选到目前为止应用程序已写入标准输出的数据。

      第二种情况是我见过的最常见的用法,如果printf() 调用不以换行符('\n')结束,则通常需要它。

      【讨论】:

        【解决方案4】:

        如果您使用 stdio 的 FILE *,您只想使用 fflush。这会将用户空间缓冲区写入内核。

        其他答案似乎缺少fdatasync。这是您要将特定文件描述符刷新到磁盘的系统调用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2012-02-15
          • 1970-01-01
          相关资源
          最近更新 更多