Linux 缓冲区
-
含义
缓冲区是内存的一部分空间,用缓冲输入输出的数据。缓冲区又分为输入缓冲区和输出缓冲区。缓冲区又被称为缓存.
-
意义
主要的意义就是为了提高cpu的效率。
输入端。假如没有缓冲区,我们要从磁盘中读取数据,有几个字符,CPU就要读写几次,CPU是高速率的,而读取是低速率的,这样做会降低CPU的效率。相反如果将数据都存在缓冲区里面,等要读取的时候就可以一次性读取多数的数据。大大地提高了CPU的效率。 输出端。假如要将数据打印出来,打印机是低速的,CPU是高速的。将数据放入缓冲区,避免数据被分为多次打印,就此解放了CPU,使它能去处理其他任务. -
调用:
所有的磁盘I/O都要进过内核的快缓冲区(内核缓冲区高速缓冲),既然read和write都要被内核缓冲,那么“不带缓冲的IO”指的是在用户的进程中对这两个函数不会进行缓冲,每次read和write都要进行一次系统调用。标准IO库提供缓冲的目的是尽可能的减少调用read和write的次数。
-
提供者
-
系统调用:操作系统直接暴露给用户的接口。
-
库函数:把系统调用进行二次封装之后给用户使用的结果叫做库函数(封装系统调用,实现相同的复杂逻辑,节省工作量)
-
因此库函数和系统调用具有层级关系,库函数是系统调用的上层(以f开头的函数如 fwrite() 都是库函数,去掉f如write是系统调用)
-
系统调用不具有缓冲区,库函数具有缓冲区,而库函数是系统调用的上层,因此,缓冲区是C语言库提供的。具体一点是由库中的文件操作符提贡的
-
-
flush:
- 行缓冲在遇到\n和缓冲区满的时候刷新
- 全缓冲在缓冲区写满的时候会刷新
- 进程退出的时候两种缓冲都会由操作系统强制刷新
- fflush()函数可刷新缓冲区
-
缓冲类型
- 全缓冲:这种情况下只有填满了缓冲区才进行实际的IO操作,对于驻留在磁盘上的文件一般实施的是全缓冲。在一个流执行第一次的IO操作时,相关标准IO函数通常调用malloc获得所需的缓冲区。当且仅当标准输入输出不涉及交互式设备时才是全缓冲。(文件操作 fwrite)
- 行缓冲:这时当输入和输出中遇到换行符,标准IO执行IO操作。( printf )
- 不带缓冲:标准错误流时不带缓冲的。stderr write()
-
’\r’和 ‘\n’的区别:
回车用’\r’表示,表示的是回到这行的起始位置。换行用‘\n’表示,表示的是换行到下一行。
-
彩色输出
终端的字符颜色由转义序列控制,是文本模式下的系统显示功能,与具体语言无关。转义序列以控制字符’ESC’开头。多数转义序列超过两个字符,故通常以’ESC’和左括号’[‘开头。该起始序列称为控制序列引导符,通常由’\033[‘或’\e[‘代替。
通过转义序列设置终端显示属性时,可采用以下格式:
`\033[ Param {;Param;…}m 或 \e[ Param {;Param;…}m`
其中,’\033[‘或’\e[‘引导转义序列,'m’表示设置属性并结束转义序列。Param为属性值,{…}表示可选(多个参数之间用分号隔开,与顺序无关)。
在实现中为了增加可读性可以我们可以将颜色定义为宏,再进行使用。
-
实现进度条
#include <stdio.h> #include <unistd.h> #define BLUE "\e[0;31m" /* * achieving progress bar */ int main() { int i = 0; while (i < 50){ printf(BLUE"="); usleep(100000); // 清空缓冲区 fflush(stdout); i++; } printf("\n"); return 0; }