缓存区的类型

简介: 缓存区的类型

无论标准I/O操作文件还是终端,都有操作缓存区。只不过这个过程是看不到的,但这一细节是不可忽略的。在使用标准 I/O 函数时,一定要注意缓存区的存在,避免产生不必要的失误。


首先,借用一个示例,展示标准I/O函数操作时,产生的缓存区问题。

#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[]) {
  while (1) {
    sleep(1);
    printf("hello world");
  }
  return 0;
}点击复制复制失败已复制


上述程序的意思是每秒输出一次 hello world ,但是编译运行后的现象并不是我们所期待的,运行后程序一直处于停滞状态(和卡死一样),直到一段时间后,一次性显示输出数据。


如果想按照我们的想法输出,需要在标准输出函数 printf() 中添加换行符,如下所示:

printf("hello world\n");点击复制复制失败已复制


由此,可以很明显地看出缓存区的存在。在没有换行符时, printf() 函数并没有立即将字符串输出到终端,是因为其字符串被输出到了缓存区中。经历一段时间之后,数据一次性输出,说明缓存区满足了刷新的条件(缓存区被写满了),此时执行系统调用,将缓存区中的数据一次性输出到终端上。添加换行符,则成功解决了这一问题,说明换行符不仅有换行的作用,同时也具有刷新缓存区的功能。


经过代码的论证,可以很明显看到标准I/O函数在使用操作时的缓存区问题,接下来则需要讨论缓存区的类型,以及缓存区的刷新条件。


标准I/O提供了三种类型的缓存,即全缓存行缓存不缓存


全缓存

当流与文件相关联时,所操作的缓存区为全缓存。通俗的讲,即当使用标准I/O函数操作流指针,而该流指针是与文件有关联的流指针时,访问的缓存区为全缓存区


例如, FILE *fp = fopen() ,标准函数操作 fp


行缓存

当流与终端相关联时,所操作的缓存区为行缓存。通俗的讲,当使用标准I/O函数操作流指针,而该流指针是与终端有关联的流指针时,访问的缓存区为行缓存区

例如,标准I/O函数操作 stdinstdout


不缓存(没有缓存区)

当使用标准I/O函数操作的流指针是不带缓存区的流指针时,没有缓存区。

例如,标准I/O函数操作 stderr


提示

对于系统预定义的两个流指针 stdoutstderr ,二者均被用来实现向终端输出信息,二者不同的地方就在于缓存区的问题。 stderr 通常被用来在特定的情况下,向终端输出错误警示信息使用,因此当程序出现问题时,必然需要立刻将错误警告输出,以便及时对程序修改,此时不需要缓存区的存在。如果错误信息保存在缓存区,则无法及时得到警告,造成不可预计的后果。

目录
相关文章
|
6月前
|
缓存 中间件 数据库
中间件缓存策略类型
【5月更文挑战第6天】中间件缓存策略类型
51 2
中间件缓存策略类型
|
缓存 Java
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
|
存储 缓存 Java
包装类型缓存池源码剖析
编译器会在自动装箱过程调用 valueOf() 方法,因此多个值相同且值在缓存池范围内的 Integer 实例使用自动装箱来创建,那么就会引用相同的对象。new Integer(123) 与 Integer.valueOf(123) 的区别在于:基本类型对应的缓冲池范围如下: 1. Byte.valueOf(“A”); byte即字节的意思,由8位组成,即其可以表示的最大值为
217 0
包装类型缓存池源码剖析
|
存储 缓存 Java
【JVM】Int类型在栈中是否会被缓存?
【JVM】Int类型在栈中是否会被缓存?
130 0
【JVM】Int类型在栈中是否会被缓存?
|
缓存
【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
217 0
|
机器学习/深度学习 缓存 算法
C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲
 使用C++风格的数组,不需要管理内存。 array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include&lt;iostream&gt; #include&lt;array&gt; #include&lt;vector&gt;   //C++的标准库 #include&lt;string
1413 0
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
28天前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
66 6