【发布时间】:2012-01-14 14:16:03
【问题描述】:
无缓冲 I/O 和标准 I/O 有什么区别?我知道使用 read()、write()、close() 是无缓冲的 IO。 Printf 和 gets 是缓冲的 IO。我也知道最好将缓冲 IO 用于大事务。我只是不知道为什么。在这种情况下,“缓冲”一词是什么意思?
【问题讨论】:
-
严格来说,在 Linux 上,除非启用了
O_DIRECT,否则 read 等都是 kernel 缓冲的。对于您的上下文,缓冲意味着 C 库维护一个内部数组,该数组在每次 I/O 函数调用后都不会刷新。相反,必须调用 fflush。同样,读取缓冲区可能会减少读取期间的每次调用挂起。 -
@moshbear:你能澄清一下 fflush 是做什么的吗?它是刷新 c 内部数组还是缓冲缓存?
-
来自手册:对于输出流, fflush() 通过流的底层写入函数强制写入给定输出或更新流的所有用户空间缓冲数据。对于输入流,fflush() 会丢弃任何已从底层文件获取但尚未被应用程序使用的缓冲数据。