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

news2024/11/17 15:49:17

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.c
     gcc -o $@ $^
                                                                                                                                                          
 .PHONY:clear
 clear:
     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*1024

void 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.coloradmin.cn/o/1314177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在jenkins容器中安装python+httprunner+pytest+git+allure(一)

背景&#xff1a; API接口自动化使用python语言实现&#xff0c;利用httprunner框架编写自动化用例场景&#xff08;执行的时候还是依赖pytest),使用jenkins自动构建git上的源代码&#xff0c;并产生allure报告可视化展示API执行结果。 步骤 1.进入jenkins容器 注意使用roo…

数据库和数据仓库的区别

数据仓库是在数据库已知大量存在的前提下&#xff0c;为了进一步挖掘数据资源&#xff0c;为了决策需要产生的&#xff1b;数据仓库在设计的时候有意添加反范式设计&#xff0c;目的是提高查询效率 对比内容数据库数据仓库数据内容近期值历史的 归档的数据数据目标面向业务操作…

ArcGIS Pro SDK 右键获取选中的图层

需求&#xff1a; 获取右键选中的图层 解决方法&#xff1a; 地图页面获取选中的图形 // 获取所选要素 var firstFeatureLayer MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(); 布局页面获取选中的地图框 Layout layout …

Tomcat 十大安全优化方法(详解版)

目录 1 talnet管理端口保护 2 AJP连接端口保护 3 禁用管理器 4 降权启动 5 控制文件列表的访问 6 隐藏版本信息 7 server header重写 8 限制IP访问 9 修改脚本权限 10 访问日志格式规范 1 talnet管理端口保护 配置内容&#xff1a; &#xff08;1&#xff09;修改默…

element-plus 结合Vue Router时出现的问题及解决方法之一

1、单文件应用element-plus中的Menu 侧边栏 <template><el-row class"tac"><el-col :span"12"><!-- <h5 class"mb-2">Custom colors</h5> --><el-menuactive-text-color"#ffd04b"background-…

GRU,LSTM,encoder-decoder架构,seq2seq的相关概念

门控记忆单元&#xff08;GRU&#xff09; GRU模型有专门的机制来确定应该何时更新隐状态&#xff0c;以及应该何时重置隐状态。这些机制是可学习的。门控循环单元具有以下两个显著特征&#xff1a; 重置门有助于捕获序列中的短期依赖关系&#xff1b;更新门有助于捕获序列中…

Axios入门案例——后端学习

目录 后端准备 导入依赖 解决跨域 User实体类 DemoController测试接口 前端准备 项目结构 axios.js axios.html 开始测试 后端结果 前端结果 后端准备 导入依赖 案例会用到以下的三个依赖。 <dependency><groupId>org.springframework.boot</gro…

案例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 小程序…

探索多功能SQL数据库编辑器 - Richardson Software RazorSQL

在当今数字化时代&#xff0c;SQL数据库的管理和编辑是许多企业和开发人员必不可少的任务。为了提高生产力和简化数据库操作&#xff0c;Richardson Software推出了一款强大而多功能的SQL数据库编辑器 - RazorSQL。 RazorSQL是一款功能全面的数据库管理工具&#xff0c;可适用…

redis五种数据结构特点

redis五种数据结构特点 redis-string介绍SDS内部存储数据结构三种编码方式特点总结 redis-list介绍quicklist特点总结 redis-hash特点总结 redis-set介绍 特点总结redis-zset介绍特点总结 redis使用五种数据结构&#xff0c;分别是string&#xff08;字符串&#xff09;&#x…

如何连接到 Azure SQL 数据库(下)

在《如何连接到 Azure SQL 数据库&#xff08;上&#xff09;》中&#xff0c;我们已经了解到了以下内容↓↓↓ 开始之前&#xff1a;Azure 连接凭据和防火墙 如何检索 Azure 连接凭据如何配置服务器防火墙使用 SQL Server Management Studio 连接到 Azure使用 dbForge Studio…

实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + y源码)

导 读 本文主要介绍基于OpenCV传统方法实现密集圆形分割与计数应用,并给详细步骤和代码。 背景介绍 实例图片来源于网络,目标是分割下图中圆形目标并计数。 本文实现效果如下: 实现步骤 【1】灰度转换 + 均值滤波 + 二值化,得到参考背景 img = cv2.imread(src.jpg)c…

AcWing 1250. 格子游戏(并查集)

题目链接 活动 - AcWing本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1252/ 题解 当两个点已经是在同一个连通块中&#xff0c;再连一条边&#xff0c;就围成一个封闭的圈。一般用x * n y的形式将&#xff08;x, y&#xff0…

注意力机制,Transformer相关详解

本文遵循《动手学深度学习pytorch版》的内容组织&#xff0c;从注意力机制开始讲到Transfomer&#xff0c;偏重关键知识理解并附带图解和公式&#xff0c;未加说明时&#xff0c;插图均来自于该书&#xff0c;文本内容较长&#xff08;9414字&#xff09;&#xff0c;建议收藏慢…

P33鱼和熊掌可以兼得的机器学习-why deep

Review: Why Hidden Layer? 在这里插入图片描述 ** 一个hidden 可以通过无数个 picewise linear 构成任意形状的曲线** 那么为什么还要 deep 呢 Why deep not Fat 同样参数量下&#xff0c;deep的模型表现优于 fat 的 Why we need deep? 使用deep&#xff0c;效率更高&…

mybatisplus使用雪花id通过swagger返回ID时精度丢失问题

在使用mybatisplus自带雪花的时候会发现返回的ID是19位的长度&#xff0c;因此在通过swagger页面展示的时候会发现后端返回的和页面展示的ID不一致问题。是因为精度丢失的问题。因此需要更改雪花ID的长度跟踪进去&#xff1a;发现是DefaultIdentifierGenerator类实现了Identifi…

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…

React中的setState执行机制

我这里今天下雨了&#xff0c;温度一下从昨天的22度降到今天的6度&#xff0c;家里和学校已经下了几天雪了&#xff0c;还是想去玩一下的&#xff0c;哈哈&#xff0c;只能在图片里看到了。 一. setState是什么 它是React组件中用于更新状态的方法。它是类组件中的方法&#x…

Redis——02,redis-benchmark 性能测试

redis-benchmark 性能测试 一、benchmark 性能测试。二、参数详解&#xff1a; 一、benchmark 性能测试。 在bin目录下&#xff0c;有一个redis-benchmark 工具&#xff0c;是用来测试性能的。 二、参数详解&#xff1a; http://doc.yaojieyun.com/www.runoob.com/redis/re…

正则化实战( Lasso 套索回归,Ridge 岭回归)

Lasso 套索回归 导入包 import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegressor, LinearRegression原方程的计算结果 # 1. 创建数据集X&#xff0c;y X 2 * np.random.rand(100, 20) w np.random.rand(20, 1) b np.r…