【Linux】 第一个系统程序——进度条

文章目录

一、预备知识

1.1 什么是回车换行

在计算机中,我们用符号\n表示换行,用\r表示回车。用\r\n整体表示回车换行。一般意义上的回车换行是两个独立的独立的动作,但是C语言中的\n同时完成了回车和换行的工作。

回车换行对应到我们键盘上的按键就是:

1.2 关于缓冲区

我们先来看一个简单的程序。

我们肯定能想到程序运行过程,先是打印出hello world,然后休眠3秒,程序退出。

如果我们把上面printf函数中的\n去掉呢?

那这个程序的现象是什么呢?还是先是打印出hello world,然后休眠3秒,程序退出吗?我们来看一下想象:

大家可以看到是先休眠三秒,在打印出hello world,最后程序退出。按理来说,程序自上往下按顺序执行代码,也就是说一定是把printf执行完了,再去执行sleep,那printf执行完了,显示器并没有显示出来,那么在休眠3秒期间,"hello world"在哪里?答案是在缓冲区里面,printf函数底层是把格式化的数据写入到stdout缓冲区,然后stdout缓冲区刷新,就会被将数据写入到内核空间,最终硬件输出到屏幕。

如果printf函数里面有\n,执行完该语句会对缓冲区进行刷新,刷新后我们就能看到,如果没有刷新,就会呆在缓冲区里面。那为什么最后又打印出来了呢?原因是程序结束后,会自动刷新缓冲区。

如果想让不带\n的字符串立马刷新,可以用fflush函数对缓冲区刷新。


可以看到立马打印出了hello world。

二、简易的倒计时

因为\r不能刷新缓冲区,只起到回车的作用,所以要用fflush函数刷新缓冲区。%-2d是让打印出的数字的宽度为2,左对齐。最后程序结束前还要打印\n,是因为最后想保留数字0,否则就会被覆盖掉。

三、进度条

3.1 version1 原理版本

我们想写的进度条是什么样的?

具体实现过程:

  1. 首先要创建三个文件process.h头文件,用于对进度条函数的声明,以及包含函数实现所需的头文件。process.c源文件,在里面定义进度条函数的实现。main.c源文件,用于调用进度条函数。
  2. 定义自动化构建工具------makefile文件

    定义完后,使用make命令,就能自动生成processbar可执行程序
  3. process.c源文件里写具体实现代码:

3.1.1实现原理:

进度条往右走的实现原理:

进度条向右走动的原理就是,这一次比上一次多打印一点内容。因此我们可以定义一个字符数组 buff,通过循环每次往字符数组里面追加字符,然后将这个字符数组打印出来,由于每次循环都会往数组里追加字符,所以就会导致下一次打印出来的内容比这一次的多,视觉上就感觉进度条在往右走。又因为进度条始终是在同一行往右走的,所以每打印完一次要用\r,是为了让光标回到当前行的最开始位置,下一次打印就会产生覆盖的效果,紧接着要对 stdout缓冲区刷新,我们才能看到字符显示出来。
字符数组 buff的长度应该是多大?

因为在进度条后紧跟的是实时进度百分比,即printf函数中的[%d%%]第一个 % 标记 "后续是格式指令",第二个 % 表示 "指令内容就是输出 %",这是格式指令的特殊写法 ,进度是从0%到100%,所以每追加一个字符,进度就增加1%,因此总共需要100个字符,以字符串的形式输出,需要确保buff数组的最后一个元素是\0。为了让 buff数组的能容纳这个100长度的字符串,还需要额外 1 个字节存储字符串终止符\0。所以buff数组长度应该是101 。在定义buff数组后,需要将buff 数组的所有字节初始化为 0(即 \0),确保在打印字符串时,buff数组中都有\0在,否则会出现乱码的想象。
旋转图标的原理:

就是定义一个label数组,存储'|','\','-','/',通过数组下标循环表示。

3.2 version2 真实版本

现实中的进度条,往往出现在下载一个东西的时候,用进度条来显示下载的进度。但是进度条本身并不知道下载了多少,它只会提供一个接口,在下载东西的时候,调用这个接口,然后将已经下载好的比率作为参数传给进度条函数,它会根据比率打印出对应的进度条进度。

main.c源文件:

process.h:
process.h:

预览效果:

🏆结语:

今天的分享就到这里,感谢各位大佬的关注,还请大家多多支持哦!

相关推荐
指尖@韶华3 小时前
【Kylin Linux root 密码故障处置指南(超限重试 + 改回原密码)】
linux·运维·kylin
求你别吃了ど⁰̷̴͈꒨⁰̷̴͈う♡3 小时前
Linux给命令起别名
linux·运维·服务器
王火火(DDoS CC防护)3 小时前
如何判断服务器是否遭受攻击?
服务器·web安全·网络安全·ddos攻击
年度最佳学生3 小时前
【linux】解决selinux 导致的 systemctl code=exited, status=203/EXEC
linux·运维·服务器
青山的青衫3 小时前
【用homebrew配置nginx+配置前端项目与后端联调】Macbook M1(附一些homebrew操作)
运维·前端·nginx
Maple_land3 小时前
内建命令揭秘与环境变量全景:Linux变量体系的完整闭环
linux·运维·服务器·c++·centos
被遗忘的旋律.3 小时前
Linux驱动开发笔记(十三)——platform设备驱动
linux·驱动开发·笔记
D11_3 小时前
阿里云服务器百度站长平台验证完整指南:SSH文件验证详解
服务器·百度·阿里云
EndingCoder3 小时前
Node.js 数据查询优化技巧
服务器·javascript·数据库·node.js·数据查询优化