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

三、进度条

相关推荐
会飞的土拨鼠呀2 小时前
Ubuntu系统缺少 iptables 工具
linux·运维·ubuntu
前端玖耀里2 小时前
详细介绍Linux命令dig和nslookup
linux·运维·服务器
2401_838472512 小时前
C++中的装饰器模式实战
开发语言·c++·算法
星期五不见面2 小时前
jetson naon super使用 sudo /opt/nvidia/jetson-io/jetson-io.py 界面闪退
linux·运维·服务器
Coder个人博客2 小时前
Linux6.19-ARM64 mm hugetlbpage子模块深入分析
linux·安全·车载系统·系统架构·系统安全·鸿蒙系统·安全架构
好奇龙猫2 小时前
【人工智能学习-AI入试相关题目练习-第十七次】
人工智能·学习
FreeBuf_2 小时前
AutoPentestX:面向 Linux 系统的自动化渗透测试工具包
linux·运维·自动化
EverydayJoy^v^2 小时前
RH134简单知识点——第11章—— 管理网络安全
linux·网络·web安全
爱学习的阿磊2 小时前
C++与Qt图形开发
开发语言·c++·算法