Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

我们在平时的服务器运维工作中,要经常安装一些软件,经常会看到下面这种进度条,本文就用C语言来实现这种进度条。

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

一、回车与换行

换行是换到下一行的当前位置,一般用n表示。回车是回到当前行的开始,一般用r表示。

但一般在语言,比如C语言中,用n代表换行 回到开始。

二、缓冲区

先来看两段代码及其现象。

第一段代码,代码很简单,主要是为了与第二段形成对比。

#include <stdio.h> #include <unistd.h> int main() { printf("I am a procn"); //有n sleep(3); return 0; }

先打印,再sleep持续3秒,很自然的结果。

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

第二段代码:

#include <stdio.h> #include <unistd.h> int main() { printf("I am a proc"); //没有n sleep(3); return 0; }

第二段代码运行结果如下,从结果看来是先sleep持续3s,然后才打印。

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

事实上,上面的代码中由于printf在sleep之前,所以printf永远先于sleep执行,但是先执行printf不代表先打印。

printf执行后,要打印的内容放入缓冲区,但不一定会被立即刷新到屏幕上。

这里要提一下缓冲区的3种缓冲策略:

  1. 无缓冲:数据不缓冲,直接打印到外设中(屏幕、磁盘等等)。
  2. 行缓冲:先保存一行数据,后续刷新时按行刷新(遇到n就把前面的内容刷新到外设)。
  3. 全缓冲:直到把缓冲区全放满才会刷新。

再结合上面两段代码及现象,可以得出上面打印时采用的是行缓冲(遇到n就把要打印的内容打印在屏幕上)。

三、倒计时的程序

如果每次打印完都回车,就相当于在第一个位置打印一个数字后,又回到该位置,继续打印下一个数字。这样就可以实现倒计时的效果。

#include <stdio.h> #include <unistd.h> int main() { int count = 3; while(count >= 0) { printf("%dr", count--); sleep(1); } return 0; }

但结果如下,并没有打印结果,想到行缓冲的规则,原来是因为打印的内容一直都没有换行,所以内容一直存在缓冲区内,不会打印出来。

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

这里可以用fflush函数强行让屏幕刷新,就可以实现想要的效果了。

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

使用fflush刷新stdout(即屏幕的文件流),使每次进入缓冲区的内容被立即打印出来。

#include <stdio.h> #include <unistd.h> int main() { int count = 3; while(count >= 0) { printf("%dr", count--); fflush(stdout); sleep(1); } return 0; }

效果如下:

但如果是两位或更多位的倒计时,就会出现如下的问题:

#include <stdio.h> #include <unistd.h> int main() { int count = 10; while(count >= 0) { printf("%dr", count--); fflush(stdout); sleep(1); } return 0; }

因为每次回车都回到第一个字符,所以第二位的0一直没有改变。

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

只需用printf的格式控制即可。

#include <stdio.h> #include <unistd.h> int main() { int count = 10; while(count >= 0) { //控制输出两位字符 printf("-r", count--); fflush(stdout); sleep(1); } return 0; }

运行效果如下:

四、进度条程序

#include <stdio.h> #include <string.h> #include <unistd.h> void ProcBar() { int i = 0; char proc[102]; memset(proc, '0', sizeof(proc)); while(i <= 100) { //C语言格式控制时默认右对齐,所以要在前面加-变成左对齐 printf("[%-100s] [%d%%]r", proc, i); fflush(stdout);//刷新屏幕打印 proc[i] = '#'; usleep(100000);//以微秒为单位的sleep i ; } printf("n"); } int main() { ProcBar(); return 0; }

Linux中的软件安装进度条怎么搞?(安装linux安装进度条不动了)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年10月3日 上午8:10
下一篇 2022年10月3日 上午8:12

相关推荐

  • 福建省科研项目申请渠道

    福建省科研项目申请渠道 随着科技的不断发展,科研项目申请也成为了一项备受关注的工作。福建省作为一个科技发达的地区,拥有着丰富的科研项目资源和良好的科研环境,因此也提供了多种科研项目…

    科研百科 2025年5月4日
    1
  • x5项目管理系统

    X5项目管理系统:提升项目管理效率的利器 随着现代软件开发和项目管理的日益复杂,传统的手动项目管理方式已经无法满足企业和个人的需求。X5项目管理系统是一种基于软件的项目管理工具,可…

    科研百科 2025年1月25日
    0
  • 科研项目有哪些技术类的

    科研项目有哪些技术类的 随着科技的不断进步,科研项目也在不断发展。在这些项目中,有许多技术类的项目是备受关注的。下面,我们来一起了解一下。 1. 机器学习项目 机器学习是近年来最受…

    科研百科 2025年5月16日
    3
  • 作业管理系统项目简述怎么写

    作业管理系统项目简述 随着数字化时代的到来,学校和企业越来越依赖于各种信息系统来管理各种事务。其中,作业管理系统是一种重要的信息系统,可以帮助学校和企业更好地管理作业和考试。 作业…

    科研百科 2025年6月27日
    0
  • 项目进度计划表模板

    项目进度计划表模板 项目进度计划表模板是项目管理中非常重要的一部分,它可以帮助项目管理人员监控项目的进度,确保项目按计划进行,并且能够及时发现和解决问题。下面是一个基本的项目进度计…

    科研百科 2024年8月20日
    52
  • 免费茶楼收银软件的套路(免费茶楼收银软件的套路有哪些)

    “免费”两个字不论在哪里,总能吸引人们的关注。就拿茶楼行业来说,很多人在日常的营业过程中,总需要一些收银系统帮助减轻管理的压力和漏洞。市面上很多的茶楼收银软件价格几百到几千不等,有…

    科研百科 2022年12月19日
    300
  • 员工管理系统项目答辩

    员工管理系统项目答辩 随着企业规模的扩大和员工的不断增加,企业需要一款高效、灵活、易用的员工管理系统来管理员工信息和工作任务。作为一名员工管理系统项目的答辩者,我将介绍我们的员工管…

    科研百科 2025年6月5日
    1
  • 电子档案管理系统图片

    电子档案管理系统图片 电子档案管理系统是现代社会必不可少的一部分。它允许用户管理和保护他们的文件,文件可以是任何类型,包括文本,图像,音频和视频。 电子档案管理系统通常由多个组件组…

    科研百科 2024年5月29日
    89
  • 科研项目等级划分,省部级(科研项目省级升级为国家级申请)

    科研项目省级升级为国家级申请 近年来,随着国家对于科技创新的重视,许多科研项目得到了快速发展。其中,科研项目的国家级升级是一个非常重要的过程,它可以帮助科研项目更好地受到国家的支持…

    科研百科 2024年8月4日
    81
  • NIH的RO1科研项目NIH的RO1科研项目

    标题:NIH的RO1科研项目:探索机器学习在医疗保健中的应用 近年来,机器学习在医疗保健领域中的应用越来越受到关注。RO1项目是NIH的一个大型科研项目,旨在探索机器学习在医疗保健…

    科研百科 2024年9月8日
    28