我了解使用 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/