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

相关推荐

  • 蔬菜花卉所廊坊基地全面投入使用

      蔬菜花卉研究所廊坊基地建设的目标是经过几年的建设,逐步成为“蔬菜花卉新品种繁育及产业化示范基地”。从基地的性能和长远发展需求出发,把该基地规划为设施栽培区和露地栽培区,两个区占…

    科研百科 2022年5月19日
    302
  • 三局一公司项目管理系统

    三局一公司项目管理系统 三局一公司是一家著名的建筑公司,他们拥有一套先进的项目管理系统,能够帮助他们更好地管理项目,提高生产效率,降低成本。 三局一公司项目管理系统是一个非常完善的…

    科研百科 2025年1月25日
    1
  • 科研项目组织设计

    科研项目组织设计的重要性 科研项目组织设计是科研项目成功的关键因素之一。一个合理的科研项目组织设计可以帮助科研项目在正确的时间,正确的地点,以正确的方式开展。正确的组织设计还可以帮…

    科研百科 2025年3月27日
    1
  • 开原市业民镇中学校长董许家:躬行践履抓党建,构建和谐促发展

    董许家同志自2016年8月担任业民镇中学校长,2017年担任业民镇中学党支部书记兼校长。从事党务工作近20年。始终坚持党的基本路线,忠诚党的教育事业,认真贯彻党的教育方针。作为一名…

    科研百科 2024年6月26日
    72
  • 2022年营收38.85亿,业绩增速放缓 金山办公:GPT-4技术会颠覆协同办公软件市场

    每经记者:可杨 每经编辑:董兴生 3月21日晚间,金山办公(SH688111,股价325.92元,市值1503.35亿元)正式公布了2022年年报数据:营业收入38.85亿元,同比…

    科研百科 2023年12月1日
    81
  • 甘肃党建怎么登录两个账号

    甘肃党建怎么登录两个账号 近年来,随着互联网技术的不断发展,甘肃党建也开始采用了新的登录方式。对于那些想要同时登录两个账号的人来说,这个问题可能会比较棘手。接下来,我将介绍一些甘肃…

    科研百科 2024年11月18日
    3
  • 大创项目管理系统代码

    大创项目管理系统代码 大创项目管理系统代码是一种用于管理大创项目的软件工具。它可以帮助学生们更好地组织和管理他们的项目,提高他们的工作效率和质量。本文将介绍大创项目管理系统代码的主…

    科研百科 2025年1月17日
    0
  • 油料所研制出2种抗除草剂转基因检测试纸

        日前,从依托中国农业科学院油料作物研究所建设的农业部转基因植物环境安全监督检验测试中心(武汉)了解到,该中心成功研制出2种主要抗除草剂转基因检…

    科研百科 2022年5月15日
    502
  • pmp或信息系统项目管理师

    成为一名信息系统项目管理师( pmp 或 ISMS 项目经理) 随着信息技术的迅速发展,越来越多的企业开始重视信息系统项目管理的重要性。作为企业信息系统项目管理的核心, pmp 或…

    科研百科 2025年1月24日
    0
  • 科研项目的设计费包含什么

    科研项目的设计费包含什么 科研项目的设计费是科研项目的重要组成部分之一,通常用于支付项目团队的工作费用,包括人员工资、办公用品、设备租赁、资料翻译等。设计费的数额取决于具体的项目规…

    科研百科 2024年11月19日
    3