【Linux】进度条与缓冲区

原创 2017年01月03日 18:47:52

Linux下缓冲区的刷新

直击主题:缓冲区

关于缓冲区,我们在C/C++编程时所了解到的就是系统提供的一个暂存区,暂时存放我们的输入和输出,是一块不太大的空间,至于具体为什么要有这块空间,当然是为了提高系统的效率;

当然,在这里就不得不提一个概念,就是标准库函数和系统调用之间的关系;

printf就是一个标准输出函数,标准库函数一般是对系统调用的封装,而printf即是对write系统调用的封装,不过在调用write之前,加入了一个缓冲区,即我们现在所说的这个缓冲区,而printf实际是向用户空间的IO缓冲写,在满足条件的情况下(条件下面会说)才会调用write系统调用,这样也就提高了内核的效率。

当然,这只是一般情况,还有其它的情况,对于系统调用和标准库函数的关系,下面我推荐一篇比较好的博客,毕竟我的水平还不够,但上面所说的内容已经可以满足本片博客的需求了;

推荐博客:

http://blog.csdn.net/skyflying2012/article/details/10044343


缓冲区的大小以及刷新方式

缓冲区的类型有三种:

标准I/O 提供了3 种类型的缓冲区。

1,全缓冲区:这种缓冲区要求填满整个缓冲区后才进行I/O 系统调用操作。对于磁盘文件通常使用全缓冲区访问。第一次执行I/O 操作时,ANSI 标准的文件管理函数通过调用malloc 函数获得需使用的缓冲区。默认大小为8192。

2,行缓冲区:在这种情况下,当在输入和输出中遇到换行符时,标准I/O 库执行I/O系统调用操作。当流涉及一个终端时(例如标准输入和标准输出),使用行缓冲区。因为标准I/O 库收集的每行的缓冲区长度是固定的,只要填满了缓冲区,即使还没有遇到换行符,也将执行I/O 系统调用操作。默认行缓冲区大小为128 字节。

3,无缓冲区:标准I/O 库不对字符进行缓存。如果用标准I/O 函数写若干字符到不带缓冲区的流中,则相当于用write 系统调用函数将这些字符写至相关联的打开文件。标准出错流stderr 通常是不带缓冲区的,这使得出错信息能够尽快地显示出来。

                                    -----参考红黑联盟

既然上面提到了行缓冲区的大小,我们就可以尝试写个小程序来测试一下我们的Linux的行缓冲区的大小;

思路:首先得知道缓冲区的刷新方式,即怎样打印内容;

printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
1 行缓冲区填满
2 写入的字符中有‘\n’ 
3 调用fflush手动刷新缓冲区
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新
5 当然,程序结束也会刷新缓冲区

现在,我们知道了缓冲区的刷新方式,先不管其它的,先来想办法确定缓冲区的大小,刚好,刷新方式的第一条,把缓冲区填满,然后自动就刷新出来了,那只要我们把缓冲区写满,我们可以得到一个缓冲区的大小,二话不说,先来试试;

写下下面的代码:

这里写图片描述

分析: 这个代码的运行结果是个死循环,相信你已经注意到了,这是我目前为止想到的比较笨也是唯一知道的办法,其中加入了一句usleep函数(不知道usleep函数可以去man —_—|||),是因为没有加的话,找不到写满行缓冲区刷新时的分割,加入这个等待时间的话,他会有一定的停顿(时间自己把握),这样我们就可以Ctral+c结束程序,将打印出的那部分放在一个空文件里,然后看这个文件的大小就知道行缓冲区的大小了,结果如下:

这里写图片描述

复制到一个空的文件名为size的文件中,然后stat看文件的大小;

这里写图片描述

分析: 可以看到文件的大小是1025个字节;即1KB的行缓冲区;


进度条的实现:

前面说了行缓冲区,缓冲区的刷新,那么下面这个进度条的实现就是对上面知识的应用;

插入一点 \r 和 \n 的区别:

1.回车换行符,是2个符。一个回车,一个换行。\r仅仅是回车,\n是换行。一个是控制屏幕或者从键盘的Enter键输入。另一个是控制“打印机”!
2.回车 = 光标到达最左侧,换行 = 移到下一行。如果只回车,打印的东西会覆盖同行以前的内容,如果只换行,打印的东西会在下一行的先一个位置继续。
3.\r实际是回到行首。\n如果下一行已经有了一些内容的话它会在那些内容的后边.因为一般情况下下一行是没有数据的,很多时候\n也就成了\r\n作用一样。

注意上面加粗的那句话,进度条的实现利用到了这一点,还有fflush强制刷新缓冲区;

代码:

这里写图片描述

然后编辑一个主函数进行调用,我在这里简单的运用了make和makefile,对于make和Makefile会在后面的深入学习中进行总结;

结果展示:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何使用gcc编译器?

本文转自网络。   摘要:  要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作...

【STL】序列式容器--list(简单复习)

【STL】常用容器总结,带有复习性质的学习更有效率;list 和 vector 是最常用的两个容器,也是在面试中最常被问到的,让你对比一下这两个容器;那么,首先复习一下 list 的结构,list 底...
  • bitboss
  • bitboss
  • 2017年06月27日 09:11
  • 153

Linux下进度条实现以及缓冲区和回车换行

进度条实现1.首先,为了实现进度条,我编写了一段小的C代码: #include #includeint main() { int i = 0; char b[102]; con...
  • tzy5210
  • tzy5210
  • 2017年02月16日 21:22
  • 157

android 控件之ProgressBar实现双进度条(通常用于流媒体的缓冲区进度)

下面详细介绍ProgressBar 一、说明   在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区...

linux下用C++代码实现简单的进度条

首先我们来分析一下这个进度条的实现原理,我先想到的是一个数组,然后利用循环来实现,接下来的细节部分用一个 ‘ # ’ 代替百分之一的大小,加上进度条左右的中括号那么可以确定数组的大小应该是【102】,...

在linux下用c和shell编写彩色进度条

进度条 显示在屏幕上的进度条一般分为三部分 1. 显示已经执行了多少 2. 执行多少占的百分比 3. 一个转盘 先来说一下普通的进度条 对于显示执行多少,一般都会预留100个空间,每0.1...

Linux - 实现简易进度条

1.背景知识讲解 2.如何实现一个简单的进度条 开始今天的内容之前,我们先来回顾一个知识,看下面一段代码(Linux下运行程序) 对比上边的代码,似乎相差不大,但是运行结果却千差万别:A图代码运...

Linux中实现一个简单的进度条

说起进度条,其实大家常常见到,比如说你在下载视频或文件的时候,提示你当前下载进度的就是我们今天要说的进度条,进度条的模拟实现是挺简单的,但是要做的比较实用还是需要注意很多地方的,下来我就一步步的深入分...

【Linux】进度条的编辑

进度条的几个特点: 1、存在一个区间,不断加载数据,直到区间加载满为止。 2、显示进度,从0%~100%。可会出现一个旋转的小圈,表示正在加载。 进度条的具体实现: 进度条的代码实现:...

Linux C语言下TCP传文件,并显示传输进度条

1.本文介绍将文件通过sever传到client端,并显示传输进度条 2.打开一个终端,执行./file_server在file_server所在目录下放好要传的文件tianitande.m...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Linux】进度条与缓冲区
举报原因:
原因补充:

(最多只允许输入30个字)