刷新没有同步

时间:2011-09-18 01:36:09

标签: c file operating-system

根据我的阅读,flush将数据推送到OS缓冲区并进行同步,确保数据下载到存储介质。因此,如果您想确保数据实际写入磁盘,则需要执行刷新,然后执行同步。那么,有没有你想要调用flush而不是同步的情况?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

是的,很多。大多数时候大多数程序都不会打扰任何各种同步操作;在关闭文件时将数据刷新到内核缓冲池就足够了。如果您使用的是日志文件系统,那么这是真的。

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

请注意,在类似POSIX的系统上,您可以通过在open()系统调用(O_SYNCO_DSYNC,{{1}上设置标记来安排数据同步等}),或随后通过O_RSYNC

答案 3 :(得分:0)

只是澄清一下,fflush()仅在使用UNIX的FILE接口时才适用,该接口在应用程序级别缓冲写入。如果使用正常的write()来电,则fflush()毫无意义。

话虽如此,我可以想到两种情况,你想呼叫fflush()但不同步:

  1. 即使应用程序崩溃,您也希望确保数据最终会进入磁盘。
  2. 强制屏蔽应用程序到目前为止已写入标准输出的数据。
  3. 第二种情况是我见过的最常见的用法,如果printf()调用没有以换行符('\ n')结尾,通常需要使用它。