Linux学习记录——칠 git、gdb部分基础知识以及进度条小程序

news2025/1/14 17:56:11

文章目录

  • 一、/r/n
  • 二、简单理解缓冲区概念
  • 三、进度条
  • 四、了解git
  • 五、初步学会使用gdb
      • 1、背景知识
      • 2、部分简单指令


一、/r/n

在写小程序之前,我们先看一下/r和/n的区别。
/n我们遇到过,它叫做换行符。/r并不知道是什么符号。实际应用中,/n可以起到我们俗称的回车作用,来到下一行头处。但是呢,我们要注意到一个问题,/n为什么叫换行符,而不是回车符呢?实际上这两个词不是一个意思,/n意为换行,/r意为回车。换行顾名思义就是换行,但是到了下一行光标不一定在最开头,可能上一行光标直接移到了下一行;来到下一行后,回车就会让光标来到最开头;一般写代码时,/n的作用就是整合了这两个,所以就是我们平常所见到的效果。

实际写代码看看

/r/n都加上

在这里插入图片描述

只用/n

在这里插入图片描述
效果其实一样

只用/r

在这里插入图片描述

什么都没打印,是因为程序运行到/r时,光标又回到了最开头,所以整个程序也就没打印出什么。

我们可以让程序暂时休眠一下来看到实际操作。

  1 #include <stdio.h>
  2 #include <unistd.h>                                            
  3 
  4 int main()
  5 {
  6     printf("hello world\r");
  7     sleep(1);
  8     fflush(stdout);
  9     return 0;
 10 }

二、简单理解缓冲区概念

延用上面的代码。

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main()
  5 {
  6     printf("hello world\n");
  7     sleep(3);                                                                                                                                                                                                 
  8     return 0;
  9 }

把\n去掉,就会发现实际执行时,光标会先闪烁一会才打印出hello world,如果加上\n,就是先打印出hello world再闪烁一会。\n后者\r还有这种反转的功能?但是不加符号也是一个正常的程序,会什么printf不先执行,而是sleep先执行?

其实并不是这样,程序运行时还是printf先执行,执行完后sleep期间字符串没有显示出来,但最后hello world还是打印出来了;最后能输出说明字符串还是有的,在这之前它已经被刷新了出来,然后被打印。既然这样,刷新之后再到打印出来这段时间,字符串一定没有丢失,肯定也存在了某个地方,这个存储地就是缓冲区。我们加上\n后,程序就按照我们的意愿打印了出来,这是因为缓冲区有它自己的缓冲策略,这里简单写一个行缓冲。只要遇到换行符,就会把符号之前的内容全部刷新出来。程序结束之前,系统会自动刷新出来缓冲区的内容,也可以用函数来手动刷新。

继续看,我们加上一个\r

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main()
  5 {
  6     printf("hello world\r");                                                                                                                                                                                  
  7     sleep(1);
  8     return 0;
  9 }

这样执行后,会发现什么都没有打印出来。

在这里插入图片描述

执行程序的时候,程序识别到hello world每个字符,打印的时候光标会一个个往后移动,直到遇到/r,光标回到了最开头,但是这时候hello world存在了缓冲区,并没有丢失,然后执行sleep,最后程序结束时,系统还需要打印自己的提示符,也就是图中的[zyd@ecs…],这时候光标在最开头,所以一打印就把hello world给覆盖了。

现在在hello world和sleep之间放上fflush,用来刷新缓冲区。

  7     fflush(stdout);                                                                                                                                                                                           
  8     sleep(3);

在这里插入图片描述

在这里插入图片描述

光标移到了最开头,然后刷新出来内容,再全部覆盖。去掉\r:

在这里插入图片描述

在这里插入图片描述

这时候光标就在末尾处。

了解这些后,我们做一个倒计时小程序

  6     int i = 9;
  7     for(; i >= 0; i--)
  8     {
  9       printf("%d\n", i);
 10       sleep(1);                                                                                                                                                                                               
 11     }

在这里插入图片描述

我们把/n换成/r,那么可以预想得到屏幕不打印东西。

在这里插入图片描述
光标停留在开头一段时间后,系统提示符就打印了出来,程序结束,在sleep之前加上fflush就可以正常打印,不过就是在原地打印,光标一直在数字上。

如果把9换成10,打印从10到0的数字,看起来可行,实际上却有差距。

只要是往显示器上打印的内容,都认为是字符。我们输入的123对于系统来说都是‘1’ ‘2’ ‘3’。而printf函数的功能实现是把输入的转换成字符串,然后遍历字符串打印出来。

现在我们改成10,打印一下

在这里插入图片描述

打印出10后,后面的每个数字都在覆盖的第1个数,而不是覆盖0,为了解决这个问题,我们可以使用“%2d”格式

在这里插入图片描述
即使不是两位数,但%2d也会有一个预留位,用来覆盖其他数字。

三、进度条

我们先写两个源文件和一个头文件,以及一个makefile。

proc.h
  1 #pragma once
  2 #include <stdio.h>
  3 
  4 extern void process();    
proc.c 
  1 #include "proc.h"
  2 
  3 void process()
  4 {
  5   printf("asdasdsa\n");
  6 }   
main.c
  1 #include "proc.h"
  2 
  3 int main()
  4 {
  5   process();
  6   return 0;                                                    
  7 }

Makefile
 1 file:main.c proc.c
  2     gcc -o file main.c proc.c
  3 .PHONY:clean
  4 clean:
  5     rm -f file   

开始写代码。我们要做的进度条是什么样子?要有一些符号用来从左覆盖到右,形象化地展示出来,这里就可以用到缓冲区来显示这块区域;要有一个百分比数字来表示进度。

我们先摆出最终写成的代码

  1 #include "proc.h"
  2 #include <string.h>
  3 #include <unistd.h>
  4 
  5 #define Size 102
  6 #define Style '-'
  7 #define Str '>'
  8 
  9 void process()
 10 {                                                                                                                                                                                                             
 11   char a[Size];
 12   memset(a, '\0', sizeof(a));
 13   int i = 0;
 14   while(i <= 100)
 15   {
 16     printf("[%-100s][%d%%]\r", a, i);
 17     fflush(stdout);
 18     a[i++] = Style;
 19     if(i != 100) a[i] = Str;
 20     usleep(100000);
 21   }
 22   printf("\n");
 23 }

其实本来是要一点点分析一点点写出代码的,但那样很浪费空间,篇幅长,不如看这样的文字分析。

我们所想象的进度条是一个矩形在一个框中不断往右走,直到这个框被填满。回到代码代码中,我们首先就需要一个数组,然后在里面不断打印更多的某个符号(这里颜色块先不说),我们先用‘=’。所以前两行建立了一个数组,并初始化,'\0’也可以换成0.

接下来进入循环,先忽略掉【%d】和%-100,我们只是打印“[%s]\r”,if判断也先不要,usleep相对于sleep可以使用更小的单位,这里的10万其实就是0.1秒,为的是更快地运行程序。如果这样打印,我们可以看到一个方括号逐渐扩大,里面符号逐渐增多的现象。这可不是我们平常所见到的进度条,方括号应当是一开始就固定好的,只是里面的符号在逐渐增多。这里我们就用左对齐或右对齐,%100s, 只不过这样从右到左打印,不符合日常印象,改成-100. 符号的样式可以随便改,比如上面用的-和>.
实际效果就是这样

在这里插入图片描述
在这里插入图片描述
i为0的时候,打出 - ,i++,此时i为1,输出> , 继续循环,i为1,输出 - 覆盖了 > .这里要考虑的问题就是越界问题,i = 100时,i ++后i为101,所以初始数组大小应为102.

这些问题解决了,还有显示进度的数字问题,[%d]即可,如果加上后面的%,%这样写其实不太行,%%即可。

不过生活中是以颜色块来显示进度的,C语言其实也可以这样。有一些C语言输出颜色的格式,可以去搜一搜。

四、了解git

git是一个管理工具,相信大多数程序员都有gitee或者github账号,本篇要写的是一些基础指令,用来在云服务器上远程管理自己的代码。

我们先创建一个新目录gitzyd,把在gitee官网自己仓库的地址给克隆过来,这样就可以在这个目录里上传代码了。

关于在gitee创建仓库,看图:

在这里插入图片描述
你可以搜索到很多开源协议的区别,这里我选择MIT,比较方便,只是自己学习代码,也不涉及版权,专利等等。一般模板选为Readme。
在这里插入图片描述
分支部分,生产/开发模型比较常用,可以共享给其他人一起使用,不过我这里是一个学习用的仓库,就只自己一个人用就行。

克隆时的代码:git clone 地址。地址可在点开仓库,代码里的克隆/下载处复制地址。
在这里插入图片描述
进入beginner,里面就有这些文件

在这里插入图片描述

把之前写的代码拷贝过来

在这里插入图片描述

现在还没有添加进仓库,只是拷贝了过来,要想添加,输入git add . 意为把当前目录所有没添加的都添加进去。

添加进去后,我们要提交代码,git commit -m “日志”,这里的提交是把代码提交到本地仓库,也就是云服务器的本地仓库。初次使用git的时候,会让用户输入自己在gitee的名字以及邮箱,两条输入后,再次提交就可以了。

在这里插入图片描述

提交完自然还是不够的,我们还需要push,推送到远端。git push。会把不一样的代码放进gitee仓库里。

在这里插入图片描述

这时候你就可以看到自己的仓库有新代码了。

在这里插入图片描述

以上出现错误不要紧,指令正确的情况下,可能是需要验证。

进入gitee后,如果想看自己仓库的信息,git log。

删除文件可以用git rm 文件

查看本地和远端的同步关系,git status。

删除仓库, rm .git -rf

五、初步学会使用gdb

1、背景知识

创建一个新目录ggdb, 拷贝过来Makefile文件,创建一个新文件test.c,然后写一些代码。

在这里插入图片描述

由于int i在for循环里面,需要支持c99,如果系统出错,那就这样make。

  1 file:test.c
  2     gcc -o file test.c -std=c99                                
  3 .PHONY:clean
  4 clean:
  5     rm -f file

在vs上调试的时候,监视,内存,打断点等等都是常有的操作,那么如何在Linux上实现?

如果我们直接gdb 可执行文件,确实会出一堆字母,但是实际上不能调试。

在这里插入图片描述
倒数第二行有个括号,里面写着 no debugging…,意思是不能调试。这是因为gcc/g++默认形成的文件为release模式,我们要换成debug模式才可以调试,在编译程序时加上-g即可。

  1 file:test.c
  2     gcc -o file test.c -g -std=c99                             
  3 .PHONY:clean
  4 clean:
  5     rm -f file

在这里插入图片描述

想要查看debug模式和release模式下文件有什么不同,我们可以用到readelf这个指令,文件在Linux中形成时遵守的二进制排布规则就是elf。如果想要只查看dubug调试信息,readelf -S 文件 | grep -i debug。

2、部分简单指令

gdb 文件名后,l 会随机哪一行展示出来代码,l 后面跟数字就是从哪一行开始访问,0和1都是第一行。

打断点

r会自动执行完整个程序,等价于vs上的F5键;b 行号就会在那一行打上断点,想要查看断点的话info b 就可以看到打过的断点,并打印出打过几次断点,如果0次就不显示。打上断点后再次r,就会停在断点处,并给你打印出断点行的代码。想要删除断点的话, d 后面跟断点的编号,在info b时我们可以看到断点的编号。删除之后我们再次打断点,会发现断点的编号增加了,因为还没有退出gdb。

打了断点后,我们还可以让断点无效,而不是删除它,和vs功能也一样。

在这里插入图片描述

我们让它无效,然后再次让它有效

在这里插入图片描述

本篇就写到这里。下一篇继续写gdb。

结束。

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

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

相关文章

鲍春健:从“走进客户”奔向“成为客户”

站在当下来看&#xff0c;小鹅通的服务力的特殊性在于其可以穿透三层&#xff0c;即以自身的服务力赋能客户的服务力。其中&#xff0c;一层是客户&#xff1b;一层是客户的服务&#xff1b;一层是客户的客户。 作者|斗斗 出品|产业家 累计终端用户数达8.2亿、最高日活14…

mysql系列之索引(待续)

目录一、索引简述1、什么叫索引2、索引的优缺点3、索引的使用场景二、索引的算法1、线性查找 Linear Search2、二分查找 Binary Search3、二叉查找树 Binary Search Tree4、平衡二叉树 AVL Tree5、B树6、B树三、B树和B树的理解1、B树和B树的区别2、数据库为什么使用B树而不是B树…

第二章.线性回归以及非线性回归—一元线性回归,代价函数,相关系数,决定系数

第二章.线性回归以及非线性回归 2.1 一元线性回归 1.概念&#xff1a; 1).自变量&#xff1a; 被用来进行预测的变量&#xff0c;相当于输入 2).因变量&#xff1a; 被预测的变量&#xff0c;相当于输出 3).回归分析&#xff1a; 用来建立方程模拟两个或者多个变量之间如何关…

从零开始学习Maven

maven Maven是apache公司开发的基于项目对象模型&#xff08;POM&#xff09; 可以通过一些描述信息来管理项目的构建、报告和文档的软件管理工具。 Maven 是用来管理项目&#xff0c;进行项目构建的一个软件。 java编写 项目构建流程&#xff1a; 1. 导入jar包 2. 配置文…

【MyBatis】RC隔离级别下,MyBatis 一级缓存、二级缓存造成的不一致情况

前言 数据库的MVCC 及 锁机制保证了数据的隔离、一致性。而建立在数据库之上的缓存&#xff0c;都会破坏掉数据库的一致性保障。本文探索在RC隔离级别下&#xff0c;MyBatis 一级缓存、二级缓存造成的坑。顺便复习一下 Spock 的用法&#xff0c;更加体验到了 Groovy 清爽的语法…

insert唯一索引加锁流程

MySQL版本&#xff1a;8.0.29 测试表&#xff1a; 测试数据&#xff1a; 开始测试&#xff1a; 事务1执行 加锁分析&#xff1a; mysql> SELECT * FROM performance_schema.data_locks\G *************************** 1. row ***************************ENGINE: INNO…

Express 中使用JWT进行登录验证

cookie 篇 : Node.js 中 cookie的验证登录 | session 篇 : Node.js 中 session验证登录 在前面讲过了两种验证登录的方式&#xff0c;其一是cookie&#xff0c;其二是session&#xff1b;那么在讲JWT之前先来简单的回顾这两种方式区别&#xff1b;cookie和sessi…

Java笔记023-包装类、String类、字符串的特性、String类、StringBuffer类、StringBuilder类

常用类包装类包装类的分类1、针对八种基本定义相应的引用类型-包装类2、有了类的特点&#xff0c;就可以调用类中的方法基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble包装类和基本数据的转换演示包装类和基本数据…

LInux目录结构

文章目录Linux的目录结构Linux的目录结构Linux路径的描述方式目录各功能介绍HOME目录和工作目录Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树型结构。 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在…

【UE4 第一人称射击游戏】37-拾取副武器“M4A1”

上一篇&#xff1a;【UE4 第一人称射击游戏】36-切换武器时改变UI本篇效果&#xff1a;在拾取副武器“M4A1”前&#xff0c;点击键盘2键是无法切换武器的&#xff0c;当拾取武器后&#xff0c;点击键盘2键可以切换武器&#xff08;目前仅是右下角的图标和文字实现了切换&#x…

VBA小模板,一个不放回的抽奖用的例子

1 问题 一个不放回的抽奖用VBA怎么写&#xff0c;下面用一个类似对对碰/ 翻牌子的游戏&#xff08;抽到的奖励不放回&#xff0c;可抽的东西越来越少&#xff09;来举例说明 1.1 首先要回顾下几个经典的随机模型 古典概型&#xff0c;重点就是每次抽奖的各个奖品&#xff0c;概…

宇视门禁一体机接线图

宇视门禁一体机接线图宇视门禁一体机带反馈信号电磁锁接线图门禁的GND线通用&#xff0c;可以连到同一根线上&#xff0c;也可以分开连简单整理如图一体机线颜色和功能对应表颜色线路绿色RS485_A粉色RS485_B黑色GND蓝色WIEGAND_OUT_D0白色WIEGAND_OUT_D1灰色WIEGAND_IN_D0棕色W…

测试面试真题|工作2年,从小厂到大厂,薪资翻倍是怎样的体验?

最近&#xff0c;霍格沃兹测试学院学员 C 同学成功拿下某互联网大厂年薪 30W 测试开发岗位 Offer&#xff0c;顺利完成从手工测试工程师到测试开发的逆袭&#xff0c;薪资翻倍&#xff08;涨幅 100%&#xff09;&#xff0c;并获得了学院颁发的优秀学员奖学金。C 同学工作刚满 …

【3D目标检测】Delving into Localization Errors for Monocular 3D Object Detection

目录概述细节错误分析概述 本文是基于单目图像的3D目标检测方法。 【2021】【MonoDLE】 研究的问题: 核心问题&#xff1a;如何提高基于单目图像的3D目标检测的效果。作者量化了每个子任务的整体影响&#xff0c;观察到以下现象 观察一&#xff1a;定位误差是制约目标检测性…

变异凯撒题解

题目变异凯撒&#xff0c;说明没有使用一般的凯撒加密看到一个密码&#xff0c;我们可以找一下规律首先密文不完全是字母&#xff0c;但是经典凯撒加密的密文一定都是字母&#xff0c;说明这个题目可能是ASCLL码表偏移&#xff0c;而不是字母表偏移经典凯撒加密是字母和字母的偏…

SSM纯注解后台代码整合(Spring+SpringMvc+Mybatis)

SSM后台整合&#xff08;SpringSpringMvcMybtis事务Rest风格统一结果封装统一异常处理拦截器&#xff09; 文章目录1 基础环境搭建1.1 建表1.2 创建web项目1.3 导入依赖坐标&#xff08;pom.xml&#xff09;1.4 包路径的创建1.5 在pojo包下编写book实体类1.6 在webapp包下导入静…

很多人还不知道中视频计划手机上发布多端横竖屏视频的方法

如果说你刚开始接触中视频&#xff0c;你必须要学会的小知识。 横屏视频是16&#xff1b;9的视频&#xff0c;一般是手机横向拍摄的视频。 上传这样的视频有两种方法。第一种是需要用到电脑&#xff0c;第二种就是我今天要分享的这种&#xff0c;没有电脑&#xff0c;我们用手…

测试新人入职第一天都做什么?

测试入职第一天都做什么&#xff1f; 大家都知道&#xff0c;入职一家新公司就是一个新的起点&#xff0c;新的开始。不管在之前公司干了多久&#xff0c;还是第一次踏入社会进入企业上班&#xff0c;都需要遵守新公司的规则以及规章制度。不管企业的规章制度是什么&#xff0…

前端提交信息规范 commit规范 commitlint husky commitizen

前端提交规范 约定式提交约定式提交安装commitizen 及其适配器husky commitlint 提交校验至此恭喜你已经配置好提交校验了&#xff0c;快去试试吧技术同学开发中有没有出现 &#xff1a; 因某种原因当需要回滚&#xff0c;这时候一看之前提交的massage真的乌烟瘴气 无法分辨回…

使用ResNet50实现CIFAR100数据集的训练

如果对你有用的话&#xff0c;希望能够点赞支持一下&#xff0c;这样我就能有更多的动力更新更多的学习笔记了。&#x1f604;&#x1f604; 使用ResNet进行CIFAR-10数据集进行测试&#xff0c;这里使用的是将CIFAR-10数据集的分辨率扩大到32X32&#xff0c;因为算力相关的…