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

三、进度条

相关推荐
律宏阔9 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔9 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴9 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千9 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei379 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei379 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei379 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW9 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW9 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux
yunwei379 小时前
eBPF 开发者教程: 简单的 XDP 负载均衡器
linux·后端·性能优化