Appearance
缓冲区的作用:
大多数的情况下是好事(加速 IO),合并系统调用。io 本身会造成阻塞,部分较慢的 io 需要 CPU 进行没有必要的等待。
行缓冲
换行的时候刷新、满了的时候刷新、fflush() 强制刷新
刷新条件:
- 缓存满(1024)的时候会刷新
- 程序正常结束时刷新
- 遇到换行符的时候刷新 ( ⭐行缓存特有 )
- fflush()强制刷新
c
printf("hello\n");
printf("buffsize: %ld\n", fp->_IO_buf_end - fp->_IO_buf_base);上面代码测试了缓冲区大小,如果在打印 hello 之前就计算大小,得到的结果是 0 ,因为缓冲区的空间还没有申请。另外,FILE 结构体的属性可以看标准 IO。
标准输入和标准输出是行缓冲, Ubuntu 上默认是 1024 字节满。
全缓冲
满了的时候刷新、强制刷新(默认,只要不是终端设备),一般是文件。
- 缓存满(4096)的时候刷新
- 程序正常结束的时候刷新
- 调用 fflush() 强制刷新
默认的大小是 4096
无缓冲
比如 stderr,需要立即输出的内容。
自定义缓冲模式
可以通过setvbuf() 设置缓冲模式。