Linux 第一个系统程序 进度条

在本章我们会学习自己写一个进度条的代码,增强我们对Linux学习的理解

一、前置补充

1.回车与换行

我们常熟知的换行好像就是一个光标移动到下一行的操作,但其实我们平时所说的换行也就是\n包含了两个动作,一个是回车\r,它是将光标回溯到当前行的首位,然后才是换行\n,将光标移动到下一行

2. 行缓冲区

缓冲区是内存空间的一部分,也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或者输出的数据,这部分预留的空间就叫做缓冲区

缓冲区按照不同的标准大概有两种分类:

①按照"标准IO库的缓冲策略"分类:分为行缓冲、全缓冲、无缓冲

这个分类是C语言标准库(libc)为了简化程序员操作,提升IO效率设计的,属于应用层面的概念

行缓冲:遇\n和fflush刷新,存在于用户态内态(标准库在进程地址空间中分配的缓冲区)

全缓冲:缓冲区满和fflush刷新,同样也存在于用户态内态

无缓冲:没有暂存,直接输出,也没有专属的缓冲区

特点是:标准库帮程序员做的封装,例如调用printf时,数据先写到标准库的缓冲区,再由标准库决定什么时候调用系统调用write,目的是减少系统调用的次数,比如行缓冲攒够一行再写,比每次输出一个字符就调用write效率高的多,因为每一次的系统调用都是有代价的

②:按照"内存空间归属"分类(用户缓冲区/内核缓冲区)

这个分类是从操作系统架构层面划分的,核心看缓冲区是在用户态内态还是在内核态内态

用户级缓冲区:存在于进程的用户态地址空间(属于进程私有内存,其他进程不能直接访问,归属于c标准库)

内核级缓冲区:存在于操作系统的内核态地址空间(所有进程共享,只有内核能直接操作,归属于Linux内核)

两种分类的理解:

两种分类互不冲突还有交叉:

以printf("hello\n")输出到终端完整流程为例,我们可以理解两者之间关系:

1.调用printf("hello\n"),数据先写入标准库的用户级行缓冲区(第一种分类的行缓冲)

2.因为遇到\n,行缓冲触发刷新---->标准库调用write

3.write 把数据从用户态内存拷贝到内核级缓冲区(第二种分类的内核级

4.内核把内核级缓冲区的数据通过驱动程序写到终端设备--->屏幕显示内容

总的来说行缓冲/全缓冲是用户级缓冲区的不同工作模式,而用户级缓冲区和内核 级缓冲区是不同层级的物理内存区域

二、倒计时程序

在写我们的进度条程序之前,我没们可以先写一个倒计时的程序来练练手:

代码通过循环、回车覆写、缓冲区刷新和秒级休眠,实现终端 10 到 0 的单行动态倒计时,结束后换行

三、进度条

相关推荐
牛油果子哥q1 分钟前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
Cloud_Shy6182 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
lizhihai_9927 分钟前
股市学习心得-AI 产业链核心标的梳理清单
大数据·服务器·人工智能·科技·学习
问心无愧051335 分钟前
ctf show web入门110
前端·笔记
weixin_523185321 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
吃好睡好便好1 小时前
说说科学爬山
学习·生活
道一231 小时前
Windows系统查看端口占用进程的3种实用方法
windows·笔记
lunzi_08262 小时前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习
凡人叶枫2 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽2 小时前
玩转RK3506SDK
linux·嵌入式硬件