APUE-缓冲

东阳的学习笔记

标准 IO 库提供缓冲的目的是尽可能减少 read 和 write 的调用次数。它也对每个IO流自动地进行缓冲管理。

标准I/O提供了以下三种缓冲:

  1. 全缓冲:直到缓冲区被填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件已经到达结尾,才进行实际的I/O操作, 将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区被填满,才进行实际的I/O操作,缓冲区内容写到外存文件中。对于在磁盘驻留的文件通常是全缓冲的

  2. 行缓冲:直到遇到换行符’\n’,才调用系统I/O库函数。
    对于读操作来说,遇到换行符’\n’才进行I/O操作,将所读内容读入缓冲区;
    对于写操作来说, 遇到换行符’\n’才进行I/O操作,将缓冲区内容写到外存中。
    由于缓冲区的大小是有限的,所以当缓冲区被填满时,即使没有遇到换行符’\n’,也同样会 进行实际的I/O操作。
    当流涉及到一个终端时,通常使用行缓冲

  3. 无缓冲:没有缓冲区,数据会立即读入或者输出到外存文件和设备上。标准出错stderr是无缓冲的,这样保证错误提示和输出能够及时反馈给用户,供用户排除错误。

ISO C 要求下列缓冲特征:

  • 当且仅当标准输入和标准输出并不指向交互式设备时,他们才是全缓冲的。
  • 标准错误绝不是全缓冲的。

但是这并没有告诉我们如果标准输入和标准输出指向交互式设备时,他们是不带缓冲的还是行缓冲的;以及标准错误是不带缓冲的还是行缓冲的。很多系统默认使用以下类型的缓冲:

  • 标准错误是不带缓冲的
  • 若是指向终端设备的流,则是行缓冲的;否则是全缓冲的;

linux中设置缓冲的函数是 setbuf 和 setvbuf

在流被关闭之前,会冲洗缓冲中的输出数据。缓冲区中的任何输入数据都会被丢弃。如果标准IO库已经为该流自动分配了一个缓冲区,则释放此缓冲区。
当一个进程正常终止时(直接调用 exit 函数或者从main 返回),则所有带未写缓冲数据的 I/O 流都被冲洗,所有的打开的标准IO流都会被关闭。

但是异常退出不会:比如 kill -9,必须谨慎

猜你喜欢

转载自blog.csdn.net/qq_22473333/article/details/114335306