使用stdio.h异步缓冲吗?

时间:2012-02-20 22:46:51

标签: c asynchronous stdio buffered

我了解使用stdio.h FILE优于直接read() / write()的优点之一是缓冲,中断处理等。所以,据我了解,所有fwrite()都会被缓冲,直到我执行fclose()。到现在为止还挺好。现在,当我执行fclose()时,我会阻止数据刷新到磁盘,还是fclose()在将数据交给操作系统后立即返回并让它在闲置时刷新到磁盘?

2 个答案:

答案 0 :(得分:3)

在许多级别都有缓冲,这取决于操作系统和许多其他事情。

通常,您的应用程序中的FILE *中有一个内部缓冲区,它被刷新到文件中(或者FILE *所连接的任何设备)

  • 当内部FILE *缓冲区已满时
  • 当您编写换行符时(如果是行缓存FILE *)
  • 关闭文件*
  • 当你拨打fflush()
  • FILE *也可以是无缓冲的

在普通磁盘文件的情况下,大多数操作系统都在内核中进行缓冲,因此刷新了 FILE *缓冲区或多或少只涉及从应用程序缓冲区到操作系统内核的内存副本,内核将负责异步将其写入实际文件,这将导致fclose()返回“马上”。

在将数据复制到OS /内核缓冲区之前,OS可能首先必须进行一些内务处理,例如,它可能需要将数据刷新到物理文件,以便为更多数据腾出空间,在文件中分配空间以确保有空间等等,使其不会立即返回。

简而言之,这取决于你,你无法控制它。通常,您可以做的“最佳”是使用平台相关的API,至少允许您将OS缓冲区刷新到物理文件,例如posix fsync()/ fdatasync()API。

答案 1 :(得分:0)

您的理解(至少部分)是错误的。

I / O是缓冲的,但缓冲区大小有限制。当缓冲区溢出时,它们将被刷新。此外,许多流行缓冲;当您写入换行符时,将刷新缓冲区。如果情况并非如此,那么当程序终止时输出到终端是非常不切实际的,所有输出都会出现。

我不认为调用必然会阻塞,否则有些函数会尝试确保底层媒体与写入同步。这通常会产生一些问题,即“太低级”并且需要处理高速缓存的复杂性并缓冲软件,但也需要硬件等。硬盘。