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.mzph.cn/news/224845.shtml

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

相关文章

学习Django从零开始之三

搭建虚拟python环境 搭建开发环境有多种方式&#xff0c;其中包括本地直接安装Python的可执行文件&#xff0c;使用virtualenv&#xff0c;以及使用Anaconda和Miniconda等工具。这些工具在创建Python虚拟环境方面各有特点。具体不同之处感兴趣的同学可以自行查阅相关资料。 简…

IP代理如何影响网站的速度?代理ip服务器有哪些作用?

目录 前言 一、如何影响速度 二、代理服务器的作用 1. 隐藏真实IP地址 2. 绕过访问限制 3. 分布式访问 4. 数据缓存和加速 总结 前言 IP代理是一种通过在用户和目标网站之间引入代理服务器来访问目标网站的方式。代理服务器充当中间人&#xff0c;将用户的请求转发给目…

flyway快速入门基础教程

flyway快速入门 一、flyway是什么&#xff1f;二、flyway使用目的1. 使用原因&#xff1a;2. 举个例子&#xff1a; 三、flyway工作原理四、flyway使用约定和命名规则1. 数据库版本文件整体约定2. 数据库版本文件夹管理约定3. 数据库版本文件命名约定4. 禁止项 五、flyway配置和…

功能测试转向自动化测试 。10 年 心路历程——愿测试人不再迷茫

十年测试心路历程&#xff1a; 由于历史原因&#xff0c;大部分测试人员&#xff0c;最开始接触都是纯功能界面测试&#xff0c;随着工作年限&#xff0c;会接触到一些常用测试工具&#xff0c;比如抓包&#xff0c;数据库&#xff0c;linux 等。 我大学学的计算机专业&#…

Python自动化测试如何自动生成测试用例?

汽车软件开发自动化测试攻略 随着软件开发在造车行业中占有越来越重要的地位&#xff0c;敏捷开发的思想在造车领域中也逐渐地被重视起来&#xff0c;随之而来的是整车厂对自动化测试需求越来越强烈。本文结合北汇在自动化测试方面的丰富经验&#xff0c;简单介绍一下实施自动…

一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程

MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档&#xff0c;数据结…

【问题解决】Buildroot文件系统dropbear 上位机scp命令Permission denied, please try again.

前提&#xff1a; 上位机&#xff1a;Ubuntu虚拟机与开发板同局域网开发板&#xff1a;Buildroot文件系统&#xff0c;开启了dropbear&#xff0c;已经联网与虚拟机同局域网 liefyuanubuntu:~/tcp-test/tcp-c-client$ scp tcp_client root192.168.8.199:/opt root192.168.8.1…

ControlNet Adding Conditional Control to Text-to-Image Diffusion Models

ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models TL; DR&#xff1a;ControlNet 使得我们能通过输入额外的条件图&#xff08;如 Canny 边缘、人体姿态、深度图等&#xff09;&#xff0c;对 SD 生成结果的空间位置有更准确的控制。它拷贝 SD 部分…

音频ncm格式转mp3格式

做个笔记&#xff0c;ncm格式转mp3格式 参考&#xff1a;传送门 import os import json import base64 import struct import logging import binascii from glob import glob from tqdm.auto import tqdm from textwrap import dedent from Crypto.Cipher import AES from mu…

【MySQL学习之基础篇】SQL

文章目录 1. SQL的通用语法2. SQL 分类3. 数据定义语言&#xff08;DDL&#xff09;3.1. 数据库操作3.2. 表操作3.2.1. 数据类型3.2.2. 表的创建和查询操作3.2.3. 应用案例3.2.3. 表的修改操作3.2.4. 表的删除操作 4. 数据操作语言(DML)4.1. 添加数据4.2. 修改数据4.3. 删除数据…

微信小程序ec-canvas(echarts)显示地图【以甘肃省为例】

文章目录 一、效果图二、实现1、下载echarts插件2、定制图形&#xff0c;生成 echarts.min.js 文件3、小程序中使用&#xff08;1&#xff09;下载甘肃地图&#xff08;2&#xff09;使用 参考文档《微信小程序使用echarts显示全国地图》《如何在微信小程序开发中使用echarts以…

如何发布自定义 npm 组件包

准备工作 1. 注册 npm 账号 还没有 npm 账号&#xff1f;去官网注册&#xff1a; https://www.npmjs.com 需要记住用户名、密码、邮箱&#xff0c;后面需要用到。 2. 查看本地 npm 镜像&#xff0c;如果不是默认的&#xff0c;需要改回来 npm config get registry重置镜像路…

【贝叶斯分析】计算机科学专业博士作业二

1 第一题 1.1 题目 已知变量A和B的取值只能为0或1&#xff0c;A⫫&#x1d469;&#xff0c;且&#x1d45d;(&#x1d434;1)0.65&#xff0c;&#x1d45d;(&#x1d435;1)0.77。C的取值与A和B有关&#xff0c;具体关系如下图所表&#xff1a; ABP(C1|A,B)000.1010.99100…

Leetcode 455 分发饼干

题意理解&#xff1a; 小孩的饭量&#xff1a; [1,2,7,10] 饼的大小&#xff1a; [1,3,5,7] 当饼的大小>小孩饭量时&#xff0c;小孩就能够吃饱。 求如何分配饼让更多的小孩子能够吃饱。 解题思路&#xff1a; 两种思路&#xff1a; 先把胃口小的孩子用较小的饼来喂饱—…

BearPi Std 板从入门到放弃 - 先天神魂篇(7)(RT-Thread 定时器-硬件定时器)

简介 BearPi IOT开发板 硬件定时器使用步骤 创建项目 参考 BearPi RT-Thread项目创建 RT-Thread TIM2 设备注册 宏定义添加 rtconfig.h 中添加 #define RT_USING_HWTIMER #define BSP_USING_TIM #define BSP_USING_TIM2生成支持TIM2的mdk5项目工程 env 指令 scons --t…

k8s中pod监控数据在grafana中展示

实现目标:将kubesphere[K8S]中运行的pod监控数据在grafana平台进行展示。 前提说明:需要在k8s每个集群中内置的prometheus配置中将pod指标数据远程写入到victoriametrics持久化数据库中。 实现效果如下: CPU使用量: round(sum by (namespace, pod) (irate(container_cpu…

Vue3-19-组件-定义和基本使用

组件的定义 个人理解 &#xff1a;1、组件&#xff0c;就是我们把某个功能模块进行封装&#xff0c;在使用时直接引入进行使用&#xff0c;极大的提高了代码的可复用性。2、在vue 中&#xff0c;一个 [.vue] 文件&#xff0c;就是一个组件。3、组件之间存在【引入】 与 【被引…

锁--07_2---- index merge(索引合并)引起的死锁

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 案例分析生产背景死锁日志表结构执行计划 EXPLAN为什么会用 index_merge&#xff08;索引合并&#xff09;为什么用了 index_merge就死锁了解决方案注&#xff1a;M…

【ArcGIS Pro二次开发】:CC工具箱1.1.5更新_免费_50+工具

CC工具箱1.1.5更新【2023.12.15】 使用环境要求&#xff1a;ArcGIS Pro 3.0 一、下载链接 工具安装文件及使用文档&#xff1a; https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5rhttps://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下…

k8s节点not ready

开发小伙伴反应&#xff0c;发布应用失败。检查后发现有个虚拟机挂掉了 启动后先重启服务&#xff1a;&#xff08;一般是自启动&#xff0c;自动拉起pod服务&#xff09; service docker restart docker ps |grep kube-apiserver|grep -v pause|awk ‘{print $1}’|xargs -i …