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

预览效果:

🏆结语:

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

相关推荐
大树887 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush47 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5207 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz7 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工8 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智8 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩9 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_9 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化