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

三、进度条

相关推荐
xiaohua100934 分钟前
Linux-JVM线程查询
linux·jvm
Aision_39 分钟前
代码安全学习手记(二):SCA 软件成分分析原理与 OWASP Dependency-Check 集成实战
运维·人工智能·学习·安全·web安全·网络安全
blueSatchel1 小时前
u-boot启动过程(bootROM到SPL到u-boot)
linux·u-boot
牛油果子哥q1 小时前
C++STL算法超全精讲:排序/查找/去重/遍历/最值/合并全套API、仿函数、Lambda适配、实战避坑
开发语言·c++·算法
Xeon_CC1 小时前
用C++编写屏幕准星
开发语言·c++
是隼人1 小时前
buuctf-pwn bjdctf_2020_babystack2题解 整数溢出(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
祖力552 小时前
快速学会数据结构中的链式队列与循环队列
linux·c语言·数据结构·算法
原凉是这样的丶2 小时前
Qwen3.8-27B 开源后,我用双 RTX 4090 跑通了:vLLM 0.27.1、128K 上下文与 MTP 实测
linux·算法
KhalilRuan2 小时前
UnityCsReference——笔记
java·开发语言·笔记