Skip to content
On this page

标准 IO 的缓冲区机制


标签:clang/basic  

缓冲区的作用:

大多数的情况下是好事(加速 IO),合并系统调用。io 本身会造成阻塞,部分较慢的 io 需要 CPU 进行没有必要的等待。

行缓冲

换行的时候刷新、满了的时候刷新、fflush() 强制刷新

刷新条件:

  1. 缓存满(1024)的时候会刷新
  2. 程序正常结束时刷新
  3. 遇到换行符的时候刷新 ( ⭐行缓存特有 )
  4. fflush()强制刷新
c
printf("hello\n");
printf("buffsize: %ld\n", fp->_IO_buf_end - fp->_IO_buf_base);

上面代码测试了缓冲区大小,如果在打印 hello 之前就计算大小,得到的结果是 0 ,因为缓冲区的空间还没有申请。另外,FILE 结构体的属性可以看标准 IO

标准输入和标准输出是行缓冲, Ubuntu 上默认是 1024 字节满。

全缓冲

满了的时候刷新、强制刷新(默认,只要不是终端设备),一般是文件。

  1. 缓存满(4096)的时候刷新
  2. 程序正常结束的时候刷新
  3. 调用 fflush() 强制刷新

默认的大小是 4096

无缓冲

比如 stderr,需要立即输出的内容。

自定义缓冲模式

可以通过setvbuf() 设置缓冲模式。

Last updated: