【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示

个人主页:兜里有颗棉花糖
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 兜里有颗棉花糖 原创
收录于专栏【Linux专栏】
本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论
演示环境:centos7
【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示_第1张图片

目录

  • 一、Linux缓冲区的知识铺垫
    • 缓冲区解释
    • 证明缓冲区的存在
  • 二、倒计时的实现
  • 三、进度条的实现

一、Linux缓冲区的知识铺垫

在编写进度条之前我们需要先了解Linux缓冲区的知识。

下图是main.c中的内容(main.c修改前),请看:
【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示_第2张图片
请看视频演示:

QQ录屏20230918112820


视频链接: https://live.csdn.net/v/329120

我们通过视频可以看到,先把Hello,Linux!打印完成之后,休眠了2秒钟之后程序结束。

现在如果我们对main.c中的内容进行修改,即仅仅把\n去掉再来看看程序执行情况:
【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示_第3张图片

请看视频演示(视频链接:https://live.csdn.net/v/329165):

缓冲区演示2

通过视频可以看到程序先休眠了2秒后才执行打印Hello,Linux!,并且没有换行。但是这里就会给我们带来了一些困惑,由于程序是从上往下开始执行的,所以程序应该是先打印Hello,Linux!不换行,然后再休眠2秒的。那为什么我们看到的程序执行过程并非和我们想象的一样的。

这一切都是缓冲区在作祟。

缓冲区解释

现在来解决上述的问题,在程序休眠2秒(是最后执行的)之前Hello,Linux!一定已经被执行完成了,那么在执行sleep(2);即程序休眠2秒期间,Hello,Linux!是在缓冲区进行存放的。这里的缓冲区是由C语言维护的一段内存。

在sleep(2)期间Hello,Linux!在缓冲区进行存放,所以这里默认行为就是在程序退出时缓冲区里的数据从缓存区内释放出来显示在我们的屏幕上。

证明缓冲区的存在

我们如果想把数据强制的刷新到显示器上的话,我们需要用到C语言中的fflush函数(强制将缓冲区中的数据写入文件(或者从文件读取数据))。
同时在Linux中,一切皆文件,所以我们的显示器起始也是文件。

请看变化后的main.c程序(使用fflush函数进行刷新):
【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示_第4张图片

现在再来看程序运行结果,请看:

可以看在现在代码执行的效果和我们想象的是一样的:先打印Hello,Linux!,然后再执行程序休眠两秒(因为我们使用了fflush()函数强制将缓冲区的数据写入到显示器stdout中,不要忘记了再Linux中一切皆文件)。

有了缓冲区的知识作为铺垫,现在开始进入正题:倒计时和进度条的设计和实现。

二、倒计时的实现

下图是倒计时的实现。
【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示_第5张图片
请看下面的演示视频(视频链接:https://live.csdn.net/v/329187):

Linux倒计时的实现。

三、进度条的实现

关于进度条的实现,代码如下:

void processbar()
{
	// printf("Hello,processBar!\n");
	char bar[NUM];
    memset(bar,'\0',sizeof(bar));
    int len = strlen(lable);
    int cnt = 0;
    while(cnt<=100)
    {
		printf("[%-100s][%d%][%c]\r",bar,cnt,lable[cnt%len]);                                                                                                                            
        fflush(stdout);
   		bar[cnt++] = STYLE;
        usleep(100000);
        if(cnt < 100) bar[cnt] = '>';
    }
    printf("\n");
}

演示结果如下,请看视频演示(视频链接:https://live.csdn.net/v/330175):

进度条

在这里插入图片描述

好了,以上就是本文的全部内容了。
就到这里吧,再见啦友友们!!!

你可能感兴趣的:(Linux专栏,linux,运维)