程序员

Linux下缓冲区的作用(将输出结果打印到终端)

作者:admin 2021-04-20 我要评论

标准输出设备 我们知道C语言中printf函数是将程序运行后要输出的内容在显示器中显示也就是将内容打印到输出设备显示器上。然而在Linux中有一个重要的概念就是 Li...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

标准输出设备

我们知道C语言中,printf函数是将程序运行后要输出的内容在显示器中显示,也就是将内容打印到输出设备显示器上。然而在Linux中有一个重要的概念就是Linux系统下一切皆文件,也就是说在Linux中,把显示器当做文件类型进行操作,数据才能够被打印到显示器上,其中,打印到显示器被称为标准输出设备。

打印的内容是如何显示到显示器上的

其实当我们每次要打印数据时,并不是将数据直接发送给标准输出设备,也就是并直接发送给显示器,而是将要打印的数据先存放到缓冲区,当缓冲区数据满时,或者程序结束时,或者手动刷新缓冲区时,缓冲区才会把数据传输到标准输出设备中,也就是显示器中进行输出。

为什么要有缓冲区

每一个文件都有自己的缓冲区,在程序结束的时候缓冲区内的程序会被全部释放。
将要打印的数据先存放到缓冲区中,然后在满足下面三个条件之一的时候:1.缓冲区数据满时; 2.程序结束时;3.手动刷新缓冲区时,再讲数据一次性传输到标准输出设备,这样的好处是:减少IO设备的操作。
如果没有缓冲区,每一次要将数据输出到显示器上,就要进行一次的IO操作,会降低IOx效率,如果现将所有要输出的数据存到缓冲区中,然后一次性传输给显示器,就会大大的提高IO效率。

通过代码理解

#include<stdio.h>
#include<unistd.h>
int main ()
{
	char buf[11] = {0};
	for (int i =0; i < 10; i++)
	{	buf[i]='——'printf("%s",buf);
		usleep(100000);  //让程序没执行一次循环休眠一段时间,便于观察
	}
	return 0}

运行这段程序,我们会发现代码会发现,输出的时候并没有像我们想象的那样,先打印一个‘—’,间隔一段时间再打印‘— —’,而是在短暂的停顿后一次性输出一串‘—’,这就是因为printf函数把要输出的所有数据都存储到了缓冲区,在程序结束后一次性将缓冲区的数据传给的标准输出设备进行打印。
在这里插入图片描述

但是标准输出文件的缓冲区有一个特性:换行刷新缓冲区
所以我们将代码进行一下修改

printf("%s",buf);
//改为
printf("%s\n",buf);

程序运行后就会发现 ‘—’ 会像我们预想的那样,每进行一次循环,输出后,间隔一段时间,再继续输出下一次。
在这里插入图片描述
在C语言中也有专门进行刷新缓冲区的指令,我们将代码进行修改

#include<stdio.h>
#include<unistd.h>
int main ()
{
	char buf[11] = {0};
	for (int i =0; i < 10; i++)
	{	buf[i]='——'printf("%s",buf);
		usleep(100000);  //让程序没执行一次循环休眠一段时间,便于观察
		fflush(stdout);  //刷新缓冲区
	}
	return 0}

运行这个程序会发现,我们并没有使用 \n 换行来进行刷新缓冲区,而是手动的使用 fflush 来刷新缓冲区,也可以实现每执行一次循环让程序休眠一段时间,再进行下一次输出。
在这里插入图片描述

;原文链接:https://blog.csdn.net/qq_49959794/article/details/115420196

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 四两拨千斤——你不知道的VScode编码Ty

    四两拨千斤——你不知道的VScode编码Ty

  • 我是如何在 Vue 项目中做代码分割的

    我是如何在 Vue 项目中做代码分割的

  • position:sticky 粘性定位的几种巧妙应

    position:sticky 粘性定位的几种巧妙应

  • 从零到一搭建React组件库

    从零到一搭建React组件库

腾讯云代理商
海外云服务器