【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:

预览效果:

🏆结语:

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

相关推荐
RisunJan5 小时前
Linux命令-rlogin(远程登录)
linux·运维
深圳恒讯5 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
蓝天下的守望者6 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
小林ixn6 小时前
从“玩具工具”到“跨语言利器”:MCP 协议实战解析
运维·服务器·网络
小顿的企业观察7 小时前
中企出海战略规划,正在从“走出去”转向“走进去”
大数据·运维·人工智能·产品运营·制造
数智化转型推荐官7 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互7 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
2603_954708317 小时前
全维度容错设计,打造微电网安全运行屏障
服务器·网络·数据库·人工智能·分布式·安全
其实防守也摸鱼7 小时前
蓝队相关知识学习(1)---常用堡垒机和服务器
服务器·功能测试·学习·网络安全·网络攻击模型·攻防对抗·蓝队
大飞记Python8 小时前
Linux命令速查手册(测试开发4年实战总结,附PDF)
linux·网络·pdf