Linux第一个小程序——进度条

Linux第一个小程序——进度条

  • 1. 前言
  • 2. 缓冲区概念
  • 3. \r && \n
  • 4. 进度条实现
    • 4.1 初级进度条
    • 4.2 升级进度条

1. 前言

在我们写这个小程序之前,我们要用到我们学的三个知识点

  1. gcc的使用
  2. vim的使用
  3. make/makefile的使用

除此之外还需要一些其他的知识点,但是这里重点是上面的三个知识点。所以如果由对这三个知识点不了的一定要先熟悉这三个知识点。

2. 缓冲区概念

  • 这里学一个函数和一个头文件。
    首先执行指令man 3 sleep查看第三手册手册。
    在这里插入图片描述
    在这里插入图片描述

函数sleep,头文件<unistd.h>
作用:休眠指定的秒数。
函数usleep,头文件<unistd.h>
作用:休眠指定的微秒。

  • 现在我们来写一段代码来证明这个缓冲区的存在。
    在这里插入图片描述
    在这里插入图片描述
    此时我们直接执行,是会直接显示打印出来的。
    现在我们稍作改动一下,把打印hello Linux/n中的换行\n去除再次执行。
    在这里插入图片描述

  • 我们先来分析一下。首先我们C语言有一种结构叫做顺序结构,也就是代码是从上到下依次执行的,不存在跳跃的情况,也不存先执行后面的再到过来执行前面的。也就是说上面的无论是哪一种情况都是printf先被执行然后才是sleep被执行的。那么为甚第二种情况我们在执行可执行程序的时候没有立马打印出结果来呢?而是过来3秒后也就是sleep(3)后才打印出结果来呢?理由只有一个,那就是我们在执行到printf的时候,是将printf里面的值保存起来后再去执行的sleep,而保存的地方就是我们的缓冲区。等到程序结束了,再从缓冲区中取出数据打印显示在显示屏上。而至于为什么第一种直接打印出来了呢?是因为/n有刷新缓冲区的作用,当缓冲区拿到数据并保存起来的时候,可以通过刷新缓冲区拿到数据。

3. \r && \n

大多数的人都认为回车跟换行是一回事。但是换行和回车其实是两回事。所谓换行,是执行到当前行的位置后,执行到当前位置的映射的垂直下的那个位置。而回车是执行到当前行位置后,回到开头。
之所以我们一直认为是同一回事,是因为我们通常在键盘上按回车,其实是同时执行了回车和换行,所以会另起一样并从头开始。

4. 进度条实现

4.1 初级进度条

#include <stdio.h>    
#include <unistd.h>    
#include <string.h>    #define NUM 103    
int main()    
{    char arr[NUM];    arr[0] = '>';    int count = 0;    memset(arr,'\0',sizeof(arr));    while (count <= 100)    {    printf("%-100s\r",arr);    fflush(stdout);    arr[count++] = '=';    if (count < 100) arr[count] = '>';                                                                                                                   usleep(100000);    }    printf("\n");    return 0;    
}    

在这里插入图片描述
此时一个简单的进度条就完成了。

4.2 升级进度条

但是,这个只是我们模仿出来的进度条。
但是实际上的进度条是附加在其他上面的,比如下载大小上的。

  • makefile
processbar:main.c processbar.cgcc -o $@ $^.PHONY:clearclear:rm main.o processbar.o processbar
  • processbar.c
char buffer[NUM] = {0};
void process_flush(double rate)
{int n = strlen(laber);static int count = 0;                                                                                                                                if (rate <= 1.0) buffer[0] = HEAD;fflush(stdout);printf("[%-100s][%.1lf%%][%c]\r",buffer,rate,laber[count % n]);buffer[(int)rate] = BODY;if ((int)rate + 1 < 100) buffer[(int)rate + 1] = HEAD;if(rate >= 100.0) printf("\n"); count ++;count %= n;
}
  • processbar.h
#pragma once
#include <stdio.h>
#include <string.h>
#include <unistd.h>#define NUM 103
#define HEAD '>'
#define BODY '='
typedef void(*call_func)(double);//重命名process_flush函数指针类型void process();
void process_flush(double rate);
  • main.c
#include "processbar.h"
#include <time.h>
#include <stdlib.h>
#define FILESIZE 1024*1024*1024void downlode(call_func rq)
{    srand((unsigned int)time(NULL));    int total = FILESIZE;    while(total)    {    usleep(5000);    //下载速度    int dw_speed = rand()%1024*1024*5;    total -= dw_speed;    if (total <= 0) total = 0;    int download = FILESIZE - total;    double rate = (download * 1.0 / (FILESIZE)) * 100;    rq(rate);    }                                                                                                                                                        
} 
int main()    
{    downlode(process_flush);    return 0;
}
  • 执行结果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/218116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

娱乐新拐点:TikTok如何改变我们的日常生活?

在数字时代的浪潮中&#xff0c;社交媒体平台不断涌现&#xff0c;其中TikTok以其独特的短视频内容在全球范围内掀起了一场娱乐革命。本文将深入探讨TikTok如何改变我们的日常生活&#xff0c;从社交互动、文化传播到个人创意表达&#xff0c;逐步改写了娱乐的新篇章。 短视频潮…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

网站服务器/域名/备案到底有什么关联?

​  在一个网站的组成中&#xff0c;网站服务器、域名、备案这几个要素是要被常提到的。在谈及三者关联之前&#xff0c;我们先了解下三者的各自概念。 域名&#xff1a;它是网站的唯一标识符&#xff0c;通俗理解来说就是用户在浏览器地址栏中输入的网址。一般来说&#xff…

【LeetCode刷题笔记(6-1)】【Python】【三数之和】【哈希表】【中等】

文章目录 三数之和题目描述示例示例1示例2示例3 提示解决方案1&#xff1a;【三层遍历查找】解决方案2&#xff1a;【哈希表】【两层遍历】 结束语 三数之和 三数之和 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! …

人工智能_机器学习066_SVM支持向量机_对偶问题转化_强对偶问题_弱对偶问题_弱对偶问题详解---人工智能工作笔记0106

上一节我们就得到了9,这个公式,这个公式要求,先去求maxL(x,lamada) ,也就是求,lamada是多少的时候,对应的, L(x,lamada) = f(x) + h(x) * lamada <=P 中的这个h(x) * lamada,最大,因为h(x)是小于0的也就是,lamada是什么的时候,h(x) * lamada最大,也就是越接近于0对吧. 然…

GaussDB如何创建和管理视图

GaussDB如何创建和管理视图 一、什么是视图 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣&#xff0c;而又不想每次键入这些查询时&#xff0c;用户就可以定义一个视图&#xff0c;以便解决这个问题。 视图与基本表不同&#xff0c;不是物理上实际存在的&#x…

nginx反向代理实践指南:访问Tomcat

目录 前言1 实现的效果2 访问流程分析3 安装tomcat并测试4 配置4.1 在Windows系统的hosts文件进行域名和IP对应关系的配置4.2 在NGINX进行请求转发的配置&#xff08;反向代理配置&#xff09; 5 最终测试结论 前言 从Windows系统访问Tomcat Web应用程序&#xff0c;设置和配置…

字符串——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、字符串相加1、题目讲解2、思路讲解3、代码实现 二、仅仅反转字母1、题目讲解2、思路讲解3…

Todesk、向日葵等访问“无显示器”主机黑屏问题解决

我的环境是 ubuntu 22.04 安装 要安装 video dummy&#xff0c;请在终端中运行以下命令&#xff1a; sudo apt install xserver-xorg-video-dummy配置 video dummy 的配置文件请自行搜索 使用任何文本编辑器打开此文件。 我的是 /etc/X11/xorg.conf 默认配置文件包含以下内…

Python等比例缩放图片并修改对应的Labelme标注文件(v2.0)

Python等比例缩放图片并修改对应的Labelme标注文件&#xff08;v2.0&#xff09; 前言前提条件相关介绍实验环境Python等比例缩放图片并修改对应的Labelme标注文件Json文件代码实现输出结果 前言 此版代码&#xff0c;相较于Python等比例缩放图片并修改对应的Labelme标注文件&a…

nodejs微信小程序+python+PHP血液中心管理平台的设计与实现-计算机毕业设计推荐

在二十一世纪的今天&#xff0c;我国献血总量已经不容小觑&#xff0c;在全国人民的不懈努力下&#xff0c;贫血、缺血的病人已经有了足够的血液保障。与此同时&#xff0c;采血工作和血液入库、出库等工作也日愈繁重。为进一步提高采血工作和血液中心的工作效率&#xff0c;开…

架构设计系列之常见架构(二)

五、DDD&#xff08;领域驱动设计&#xff09; 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种开发思想&#xff0c;强调将软件系统的注意力集中在业务领域上&#xff0c;将领域视为应用的核心。在架构设计中&#xff0c;DDD 提供了一种不同…

IDEA debug窗口左边工具栏隐藏与显示

今天在debug排查代码的时候一不小心点到哪里&#xff0c;结果变成这样 我们可以这样恢复&#xff0c;右键Debug 点击show Toolbar

Excel实现字母+数字拖拉自动递增,步长可更改

目录 1、带有字母的数字序列自增加&#xff08;步长可变&#xff09; 2、仅字母自增加 3、字母数字同时自增 1、带有字母的数字序列自增加&#xff08;步长可变&#xff09; 使用Excel通常可以直接通过拖拉的方式&#xff0c;实现自增数字&#xf…

牛客后端开发面试题2

微软2021 1、给你一个凸多边形&#xff0c;你怎么用一条线&#xff0c;把它分成面积相等的两部分 将凸多边形的任意一个顶点作为顶点&#xff0c;然后连接另外两个相邻的顶点&#xff0c;将凸多边形划分成多个三角形。 计算每个三角形的面积&#xff0c;并且累加面积&#xff…

安恒明御安全网关 aaa_local_web_preview文件上传漏洞复现

0x01 产品简介 明御安全网关秉持安全可视、简单有效的理念,以资产为视角,构建全流程防御的下一代安全防护体系,并融合传统防火墙、入侵检测、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 0x02 漏洞概述 明御安全网关在…

[css] flex wrap 九宫格布局

<div class"box"><ul class"box-inner"><li>九宫格1</li><li>九宫格2</li><li>九宫格3</li><li>九宫格4</li><li>九宫格5</li><li>九宫格6</li><li>九宫格7&l…

Axure之动态面板轮播图

目录 一.介绍 二.好处 三.动态面板轮播图 四.动态面板多方式登录 五.ERP登录 六.ERP的左侧菜单栏 七.ERP的公告栏 今天就到这了哦&#xff01;&#xff01;&#xff01;希望能帮到你了哦&#xff01;&#xff01;&#xff01; 一.介绍 Axure中的动态面板是一个非常有用的组…

案例066:基于微信小程序的家政预约设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Qt容器QMdiArea 小部件提供一个显示 MDI 窗口的区域

## QMdiArea ## 控件简介 QMdiArea 继承 QAbstractScrollArea。QMdiArea 小部件提供一个显示 MDI 窗口的区域。QMdiArea的功能本质上类似于MDI窗口的窗口管理器。大多数复杂的程序,都使用MDI框架,在 Qt designer 中可以直接将控件 MDI Area 拖入使用。 ## 用法示例 例 qm…