Linux基于centOS7 【进度条】【Git】【gdb】学习

目录

进度条

进度条的前置准备

sleep (秒)& usleep(微秒)

sleep加\n和不加\n的区别

IO函数的缓冲区

回车&换行

10秒倒计时

进度条编写

git的使用

为什么要有git(git版本控制器)

git的主要功能

Linux下载git的指令

git的创建

git的传输本地仓库

1,将目标文件复制粘贴到gitee的路径下

2,将目标文件添加到暂存区里

3,将目标文件添加到历史记录里,即提交到本地仓库

如果还需提交到远端的话

git出现错误

git status

创建一个文件后的状态

放进缓存区后的状态

​编辑

放到本地仓库后的状态

​编辑

远程提交完后的状态 

git rm file_name 

gdb调试

测试代码

g++调试前提 

调试工具使用

查看代码

运行代码

打断点

逐语句和逐过程

查看数据

范围跳跃


进度条

进度条的前置准备

sleep (秒)& usleep(微秒)

sleep加\n和不加\n的区别

创建Makefile文件和mytest.c文件

//Makefile
mytest:mytest.cgcc mytest.c -o mytest.PHONY:clean
clean:rm -f mytest//mytest.c
#include<stdio.h>
#include<unistd.h>int main(){printf("hello sleep   \n");sleep(1);return 0;
}

编译并运行,如下图,程序等1秒自动结束,并没有什么问题 

当我们将mytest.c里面的 \n 去掉之后,重新编译运行

结果是等了一秒,没有反应,一秒后才变成上图的样子

为何会如此?

IO函数的缓冲区

在这一秒内,其实printf已经跑完了,我们没有看到printf及时显示出来的原因是,它输出的字符串被保存起来了。在我们退出的时候它才显示出来

那它保存在了哪里呢?

printf输出的内容是保存在了IO函数提供的缓冲区内

回车&换行

回车就是退回到这一行的最开始的地方,回车符为 '\r'

换行就是从这一行垂直到下一行,才叫换行,不回到最开始的地方

所以回车+换行,就是到下一行的最开始的地方

10秒倒计时

fflush的作用就是清空缓存区,把它搬到stdout上,stdout可以认为它是屏幕

#include<stdio.h>
#include<unistd.h>
int main(){int ret = 10;while(ret!=0){                    -的意思就是左对齐,2就是占两个字符printf("%-2d\r",ret);  -2组合起来就是,向左对齐,留两个位,一个位时,站左边fflush(stdout);ret--;sleep(1);}return 0;
}

进度条编写

  1 #include"processbar.h"2 3 const char* lable = "|/-\\";4 void process()5 {6   char buffer[NUM];7   memset(buffer,'\0',sizeof(buffer));8   int cnt = 0;9   buffer[0] = Head;10  // int n = strlen()11   while(cnt<=100) //它会循环101次12   {13     printf("[%-100s][%3d%%][%c]\r",buffer,cnt,lable[cnt%4]);14     fflush(stdout);15     buffer[cnt]=Body;16     cnt++;  //因为到最后cnt是100也能进,所以有效字符会变成101,给\0加一个,所以给10217     if(cnt<100)                                                                                                                                                                     18       buffer[cnt]=Head;19     usleep(50000);20   }21   printf("\n");22 }

但是我们此刻写的进度条并不是我们熟悉的进度条,这个进度条是死的,不受其他程序约束的

因为进度是多少,进度条并不知道,进度条不应该是一个独立的程序,而是应该依附于其它应用的,比如下载

因此,我们先模拟一个网络的下载过程

  1 #pragma once                                                                                                                                                                                                                            2                                                                                                                        3 #include<stdio.h>                                                                                                                                     4 #include<unistd.h>                                                                                               5 #include<string.h>                                                                                                                                     6 #include<stdlib.h>                                                                                                                                                   7 #include<time.h>                                                                                                                                                                               8                                                                                                                        9 #define NUM 103                                                                                                                                             10 #define Body '='                                                                                                                     11 #define Head '>'                                                                                                          12                                                                                                                                                    13 typedef void (*callback_t)(double);                                                                                                                                                             14 //函数指针类型                                                                                                                                                                                                                               15 //version 2                                                                                                                                      16 void process_flush(double rate);       
  3 #define FILESIZE 1024*1024*10244 5 //模拟一种场景,表示一种下载任务6 void download(callback_t cb){ //参数为函数指针7   srand(time(NULL)^1023); //只是让时间变得更随机一些,先种下随机数的种子8 9   int total = FILESIZE;  //文件总大小10   while(total)11   {12     usleep(5000);//下载动作13     int one = rand()%(1024*1024); //单次下载量,最慢网速是0,最快网速是1兆14     total-=one;                   //剩余的量15 16     if(total<0) total = 0;        //怕减为负数,直接归017 18     int download = FILESIZE - total;//已经下载的量19     double rate = (download*1.0 / (FILESIZE)) * 100.0; //下载比例20     cb(rate);                                                                                                                                                                                                                           21   }22 }  
#include"processbar.h"    const char* lable = "|/-\\";  
char buffer[NUM] = {0};    
void process_flush(double rate){    static int cnt = 0;    if(rate <= 1.0) buffer[0] = Head;    printf("[%-100s][%5.1f%%][%c]\r",buffer,rate,lable[cnt%4]);    fflush(stdout);    buffer[(int)rate]=Body;    if((int)rate+1 < 100) //+1 very improtant                                                                                                                                                                                                 buffer[(int)rate+1]=Head;    if(rate>=100.0) printf("\n");    cnt++;    cnt = cnt % 4;    
}    

git的使用

为什么要有git(git版本控制器)

开发的时候,也许会遇到项目经理或者上面的佬提出各种粗略的任务,到验收的时候却说这里不合,那里不好。需要重复的改,改着改着忘记了以前的版本,有时改了之后甚至没有以前的好,但却回不去了。

所以为了能够回去找到以前心仪的code,就有了git

git的主要功能

Git 能够记录每次文件的修改,包括修改的内容、修改者、修改时间等信息。这使得开发者可以追踪文件的历史变化,理解项目的发展过程。

Git 支持强大的分支管理功能。开发者可以轻松地创建、合并和删除分支,从而实现并行开发和功能测试。

后来为了方便给予不同人共同管理它们远程或者本地存放他们项目的仓库,基于git的基础上,创建出来网页版的管理,如,GitHub,gitee,gitlab等

Linux下载git的指令

sudo yum install -y git

git的创建

下面以gitee码云为例

展示创建远端仓库,并拉取到本地作为本地仓库操作

首先要创建一个仓库,给予操作系统 

  1. 进入Gitee官网(登录注册),点击右上角头像处,找到我的仓库,点击,新建

        2,设置仓库属性

3,复制文件相关地址,到Linux终端,并在Linux终端下执行

处理完之后,我们会发现我们多了一个目录

.git 文件夹里就是我们的本地仓库

 我们进        .gitignore看看

凡是出现在这个文件里的后缀以后都不会被添加进仓库,git 不会对二进制文件进行管理 ,不想对非源代码进行管理,所以会在.gitignore 文件里标注不会鸟的文件后缀

修改.gitignore是即时生效的,在添加新后缀否认成员时,不要忘了*

git pull 本地仓库和远端仓库同步

git的传输本地仓库

如图所示,将目标文件导入仓库中共三个阶段

1,将目标文件复制粘贴到gitee的路径下

2,将目标文件添加到暂存区里

[lhl@VM-20-2-centos linux_git_try]$ git add .

3,将目标文件添加到历史记录里,即提交到本地仓库

语法: git commit -m "提交日志"

提交日志需要我们好好写,不要随便写

[lhl@VM-20-2-centos linux_git_try]$ git commit -m "第一次提交进度条代码,测试已经通过"

如果还需提交到远端的话

[lhl@VM-20-2-centos linux_git_try]$ git push
输入账号密码后       

则成功到达远端,本质就是本地仓库跟远端仓库同步

git出现错误

当我们第一次使用git,或者其他情况下

比如:我第一次使用

 [lhl@VM-20-2-centos linux_git_try]$ git commit -m "第一次提交进度条代码,测试已经通过"

会出现

也就是说git不认识你,不知道你是谁,此刻你告诉git你是谁就可以了

语句

git config --global user.name '你的昵称' 
git config --global user.email '你的邮箱' 

 当然,我们一开始复制的地方也有

配置用户名和昵称的原因是:保证每段被提交的代码,可被溯源

git status

可以查看git的状态

创建一个文件后的状态

放进缓存区后的状态

放到本地仓库后的状态

远程提交完后的状态 

 

回到啥也没有的状态 

git rm file_name 

删除也是一次提交,也必须通过相应的步骤

 进行远端同步后,远端的网站也没有了test.c文件

 查看一下日志

gdb调试

测试代码

  1 #include <stdio.h>  2   3 int sum(int n){  4   int i =1;  5   int sum = 0;  6   for(;i<=n;i++){  7     sum+=i;  8   }  9   return sum;  10 }  11   12 int main(){13   printf("\n");14   printf("--------------------------------------------\n");15   printf("开始执行\n");                                                                                                   16   int result = sum(100);17   printf("result is %d\n",result);18   printf("--------------------------------------------\n");19   printf("\n");                                                                                                                                                                                              20   return 0;                                                                                                               21 }                      

gcc/g++调试前提 

我们尝试对其进行调试一下

可以发现我们是调试不了的

究其原因就是gcc/g++写出来的代码默认是release版本,就跟编译的时候默认是动态链接一样

debug 和 release 区别

debug形成的可执行程序会给我们添加调试信息

release形成的可执行程序会给我们去掉调试信息
 

那我们要如何才能使gcc/g++编译的时候编译的是debug版本呢

在编译语句添加 -g 选项

  1 mytest_d:test.c2   gcc -o $@ $^ -g      debug环境下的编译语句
  1 mytest_d:test.c2   gcc -o $@ $^   release版本下编译语句

在大小上,debug是大于release

 

多出来的便是调试信息

如果想看更为详细的信息,则使用readelf,来看可程序程序的格式

而release是找不到debug信息的

所以将makefile里的编译信息增加条件 -g 即可

调试工具使用

查看代码

使用list,也可以使用list的缩写l,来查看我们的代码

我们一开始可能会因为上次退出光标所在位置的原因,让所展示的代码不是最开始处开始

因此,我们用 l 1

我们就可以看到从第一行开始的代码,但是其依旧无法展示出我们全部的代码

所以Enter,直至展示出所有的代码 

运行代码

使用run ,或者用缩写r,是指让程序跑起来,是直接跑完

打断点

使用b number,比如 b 2 在第二行打断点,从而达到一个打断点

或者 b 函数名 ,比如b sum ,在函数的入口处打断点

使用 info b 来显示断点,查看断点

使用 d  断点编号(非行号)来删除断点

这是因为我们要删除断点,只能通过断点编号来去删除,不能通过打断点的代码行数来删除

 

使用disable 断点编号  来关闭断点

使用enable  断点编号,来开启断点

逐语句和逐过程

逐语句进入函数:s

然后一直回车

逐过程: n

查看数据

p  变量 :查看变量的值

display  变量:常显示变量的地址和内容

undisplay   编号 : 取消常显示

bt:调用堆栈

范围跳跃

c: continue 从一个断点运行到下一个断点(范围查找)

finish:将一个函数运行结束,就停下来(范围查找)

until:在一个范围内,直接运行到指定行

以上便是本次博文的学习内容,如有错误,还望各位大佬指点,谢谢阅读

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

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

相关文章

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz&#xff0c;如果…

业绩增长新引擎:智能名片如何助力销售突破

01、智能名片&#xff0c;营销增长利器 在当今竞争激烈的市场环境下&#xff0c;企业正面临着类似品牌曝光不足、销售线索获取困难、客户关系维护复杂等诸多挑战。为帮助企业解决相关难题&#xff0c;促进业绩高效增长&#xff0c;纷享营销通的 智能名片 应运而生&#xff0…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

DB-gpt + one-api + kimi-free-api 真香

# 1. 新建文件夹 one-api 和 子目录 mkdir -p /docker/one-api/data# 运行容器one-api docker run --name one-api -d --restart always -p 3333:3000 \ -e TZAsia/Shanghai -e REDIS_CONN_STRINGredis://192.168.0.3:6379 -e SYNC_FREQUENCY60 -e SQL_DSNroot:123456tcp(192.1…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

极限两边夹定理

极限两边夹定理 1. 定义 两边夹定理 (又称作夹逼定理) 说的是&#xff0c;如果一个函数 f f f 被夹在函数 g g g 和函数 h h h 之 间&#xff0c;当 x → a x \rightarrow a x→a 时&#xff0c;这两个函数 g g g 和 h h h 都收敛于同一个极限 L L L&#xff0c;那么当…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理

LRTimelapse Pro 7.0 安装教程

软件介绍 LRTimelapse Pro (LRT) 是一款专业的延迟摄影编辑渲染工具&#xff0c;具有高清输出、简单易用、无缝转换等特点。是非常强大的一款延迟摄影工具&#xff01;LRTimelapse Pro可以将您的影片提升一个水准。 程序可以配合 Adobe Lightroom, Adobe Camera RAW 和 Adobe…

2024年孝感中级职称报名开始了吗?

2024年孝感中级职称申报终于开始了&#xff0c;之前参加过水测的小伙伴们&#xff0c;开始准备评审了 2024年孝感本批次申报时间&#xff1a;中级、初级职称网上申报时间:2024年8月1日至8月31日。 注意&#xff1a;个人通过“湖北省职称评审管理信息系统”申报&#xff0c;须先…

Llama 3.1 重磅发布,登顶开源大模型王座!

7月23日&#xff0c;Meta正式发布迄今为止最强大的开源模型——Llama 3.1 405B&#xff0c;同时发布了全新升级的Llama 3.1 70B和8B模型。 Meta在正式发布里也附上了长达92页的论文《The Llama 3 Herd of Models》&#xff0c;揭示了Llama 3模型的技术和训练细节。 论文地址&am…

Jacoco 单元测试配置

前言 编写单元测试是开发健壮程序的有效途径&#xff0c;单元测试写的好不好可以从多个指标考量&#xff0c;其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算&#xff0c;…

图解RocketMQ之生产者如何进行消息重试

大家好&#xff0c;我是苍何。 上一篇留了一个小问题&#xff0c;如果消费者出现异常&#xff0c;消费某一条消息失败&#xff0c;这时候 RocketMQ 会怎么处理呢&#xff1f; 你可能会用你聪明绝顶的脑袋瓜子想&#xff0c;苍何你是不是傻&#xff0c;失败了肯定重试啊&#…

单据新增,限制单据栏位的录入值,设置过滤条件

希望通过开发实现 单据头的组织栏位,只能选择101开头的组织,实现的效果如下: 代码如下: using Kingdee.BOS.Util; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using System.ComponentModel;namespace cux.button.test {…

基于opencv的人脸识别(实战)

前言 经过这几天的学习&#xff0c;我已经跃跃欲试了&#xff0c;相信大家也是&#xff0c;所以我决定自己做一个人脸识别程序。我会把自己的思路和想法都在这篇博客内讲清楚&#xff0c;大家可以当个参考&#xff0c;&#x1f31f;仅供学习使用&#x1f31f;。 &#x1f31f…

分享10个好用的论文编辑服务/平台

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 如果您对自己的学术写作能力存在怀疑&#xff0c;论文编辑服务/平台或许能提供帮助。为了帮助您做出更好的选择&#xff0c;今天的分享我们列出了2024年“全网”最好用的10个论文编辑服…

怎么样建设数字化车间?

建设数字化车间是一个综合性的过程&#xff0c;旨在通过现代信息技术、智能设备和自动化技术对车间进行优化改造&#xff0c;提高生产效率和产品质量。以下是一些关键步骤和要点&#xff0c;用于指导数字化车间的建设&#xff1a; 一、明确建设目标和需求 分析现状&#xff1…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

Mybatis-Plus-常用的注解:@TableName、@TableId、@TableField、@TableLogic

1、TableName 经过之前的测试&#xff0c;在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操作的表为user表由此得出结论&#xff0c;MyBatis-Plus在确定操作…

Python:随机数、随机选择的应用

step1:导入 导入的random相当于是创建了random文件里的的一个对象 import random random() 产生0~1随机数 randint(a,b)产生a~b的整数 闭区间&#xff0c;可以取到a,b random.choice(touple_name)从touple_name&#xff08;数组、列表..&#xff09;中随机选择元素 import rand…

Java人力资源招聘社会校招类型招聘小程序

✨&#x1f4bc;【职场新风尚&#xff01;解锁人力资源招聘新神器&#xff1a;社会校招类型招聘小程序】✨ &#x1f393;【校招新体验&#xff0c;一键触达梦想企业】&#x1f393; 还在为错过校园宣讲会而懊恼&#xff1f;别怕&#xff0c;社会校招类型招聘小程序来救场&am…