Linux缓冲区

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38356149/article/details/89323491

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;
      }
    

猜你喜欢

转载自blog.csdn.net/qq_38356149/article/details/89323491
今日推荐