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 的单行动态倒计时,结束后换行

三、进度条

相关推荐
今儿敲了吗1 分钟前
27| 魔法封印
数据结构·c++·笔记·学习·算法
桂花很香,旭很美2 分钟前
Anthropic Agent 工程实战笔记(四)长任务与多 Agent
笔记·架构·agent
2501_918126915 分钟前
stm32能做次声波检测器吗?
c语言·stm32·单片机·嵌入式硬件·学习
好好学习天天向上~~6 分钟前
13_Linux_学习总结_进程终止
linux·学习
今儿敲了吗7 分钟前
30| 木材加工
数据结构·c++·笔记·学习·算法
土拨鼠烧电路9 分钟前
笔记08:供应链的生命线:预测、库存与韧性
人工智能·笔记
WW_千谷山4_sch13 分钟前
MYOJ_7789:(洛谷P3388)【模板】割点(割顶)(tarjan算法)
c++·算法·深度优先·图论
锅包一切13 分钟前
PART7 队列
c++·学习·算法·leetcode·力扣·刷题·队列
learndiary17 分钟前
[其他] Linux技术视频分享11则,deepin 25 平台制作
linux·运维·视频
xhyu6118 分钟前
【学习笔记】推荐系统 (3.召回:矩阵补充、线上服务、双塔模型)
笔记·学习·矩阵