c - 缓冲 io 使用 stdio.h 异步吗?

标签 c asynchronous stdio buffered

我了解使用 stdio.h FILE 相对于直接 read()/write()< 的优点之一 是缓冲、中断处理等。因此,据我了解,所有 fwrite() 都会被缓冲,直到我执行 fclose() 为止。到目前为止,一切都很好。现在,当我执行 fclose() 时,我会阻塞直到数据刷新到磁盘,还是 fclose() 在将数据移交给操作系统并让它在空闲时刷新到磁盘?

最佳答案

有很多级别的缓冲,这取决于操作系统和许多其他因素。

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

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

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

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

简而言之,这取决于情况,并且您无法控制它。通常,您能做的“最好的”就是使用平台相关的 API,至少允许您将操作系统缓冲区刷新到物理文件,例如 posix fsync()/fdatasync() API。

关于c - 缓冲 io 使用 stdio.h 异步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9369597/

相关文章:

c - 四舍五入整数以始终以 0 结尾

C fscanf 输入格式

python - 什么是 Python 中的异步?

java - 将字符串转换为数组再转换为 Observable 中的对象

node.js - Nodejs 子进程在 stdio 流关闭之前退出

c - 制作链接列表

c - 结构体成员 char * 在函数调用中作为参数初始化

asynchronous - DART 异步/等待不等待

c - '#include <stdio.h>' 在 C 程序中真正做什么

c - 为什么 gcc(linux) 中考虑使用 fgets() 以及使用它的替代方法是什么?