C语言中的缓冲区

什么是缓冲区?

缓冲区的本质:一段内存

为什么要有缓冲区?

假设没有缓冲区,处理数据采取的方案,直接将数据进行刷新,IO次数较多,从而降低整机的效率。

因此:我们在进程中,取一段内存作为缓冲区,集中处理数据,减少IO次数,从而达到整机效率的目的

缓冲区是在哪?

由语言提供

以下为证明过程:

int main()
{
  printf(" printf ");
  fprintf(stdout," fprintf  ");

  const char* s1=" fgets ";
  fputs(s1,stdout);
  
  const char* s2=" write ";
  write(1,s2,strlen(s2));


  sleep(5);
  return 0;
}

上面这段代码中执行结果是怎么的?

在这里插入图片描述
在这里插入图片描述
先输出write,,5秒后在输出,printf fprintf fgets

原因:缓冲区是语言层提供的,printf fprintf fgets先进入缓冲区,等待刷新,write为系统调用,没有缓冲区,直接刷新,sleep过后,进程退出,刷新缓冲区

缓冲区的刷新策略

常规:

  1. 立即刷新(无缓冲)
  2. 逐行刷新(行缓冲)
  3. 缓冲区满(全缓冲)

特殊:

  1. 进程退出
  2. 用户强制刷新(fflush)

对于显示器设备而言,一般采取逐行刷新

int main()
{
  printf("printf\n");
  fprintf(stdout,"fprintf\n");

  const char* s1="fgets\n";
  fputs(s1,stdout);
  
  const char* s2="write\n";
  write(1,s2,strlen(s2));
  
  return 0;
}

write在后
在这里插入图片描述

对于磁盘而言,采取的方式为全缓冲

重定向

int main()
{

  int fd = open("log.txt",O_WRONLY | O_CREAT |O_TRUNC,0666);
  
  dup2(fd,1);//dup2为重定向

  printf("printf\n");
  fprintf(stdout,"fprintf\n");

  const char* s1="fgets\n";
  fputs(s1,stdout);
  
  const char* s2="write\n";
  write(1,s2,strlen(s2));
  
  return 0;
}

在这里插入图片描述
write在前

最后为了加深对缓冲区,重定向,及进程的理解,看下这道题,log.txt的内容

int main()
{
  int fd = open("log.txt",O_WRONLY | O_CREAT |O_TRUNC,0666);
  
  dup2(fd,1);

  printf("printf\n");
  fprintf(stdout,"fprintf\n");

  const char* s1="fgets\n";
  fputs(s1,stdout);
  
  const char* s2="write\n";
  write(1,s2,strlen(s2));

  fork();
  return 0;
}

在这里插入图片描述
为什么会产生这样的现象?

在这里插入图片描述
write为系统调用,没有缓冲区

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值