您的位置:首页 > 娱乐 > 八卦 > Linux第九节课 - git / gdb

Linux第九节课 - git / gdb

2024/10/5 20:17:47 来源:https://blog.csdn.net/weixin_47702917/article/details/140848217  浏览:    关键词:Linux第九节课 - git / gdb

注意点:

  • 缓冲区中的内容被保存起来刷新不出来在Windows看不出来,只有在Linux系统下可以看出来!
  • extren关键字声明函数的时候可带可不带,因为在头文件进行一定是进行函数的声明,但是变量的声明一定要带上extern!

进度条的思路:

从左到右,第一次显示1个字符,第二次显示2个字符,第三次显示3个字符.......

每次显示多一个字符,且将前面的字符给覆盖掉!

注意点:

  • 使用usleep函数(头文件依然为#include<unistd.h>)

休眠时间为微秒!   1s = 1000毫秒 = 1000*1000微秒!

  • 右括号不动,左边最终#移动至右括号:空字符不占位置,有效输出的#一共有100个 --- >>> [%-100s]
  • 此时我们还想输入百分比%:在[%-100s]右边加上[%d] --- cnt即可 --- 但是此时只显示数字,没有对应的百分比!
  • 用两个%来显示百分号![%d%%];或者\%(转义字符)也可以打印%,但是不推荐

如何实现一个加载符号(旋转光标)?

方法(原理):第一次输出一个 | ,第二次覆盖式的写入一个 / ,第三次覆盖式的写入 — ,第四次再覆盖式的写入 \ ,然后再写入 — !

注意点:\(反斜杠是一个特殊的字符),因此通过\\解除注释表示一个\\!

如果我们想写成最后一个符号是>的形式,可以参考下列代码:

   15   while(cnt <= 100)                           16   {                                           17     printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt % len]);  // 没有\n,就没有立即刷新,因为显示器模式是行刷新18     fflush(stdout);                           19     bar[cnt++] = Str_style;                   20     bar[cnt] = '>';     // 在这次循环中,前cnt行打印的是Str_style,然后cnt+1,在cnt+1行打印'>'                                
E> 21     usleep(100000);                        22   } 

但是该代码有个问题:我们一共定义102个字符(循环从0~100执行了101次,显示101个数字,\0为第102个)

当cnt = 100时,此时循环内在cnt = 101的位置上将其改为'>',但是101上面应该放\0,因为我们应该加上条件判断!

如果我们不希望程序结束后,#留在最后:将cnt = 100的情况删去!

此时进度条进度已经差不多了,我们可以将程序优化一下:将数字改成宏,函数自定义传入参数等

最后显示进度条代码对应的源文件和头文件:

头文件:processBar.h

#pragma once#include<stdio.h>
#define Str_style '='  // 将字符定义为#
#define NUM 102 // 循环共101次,再加上\n一共102
#define BODY '='
#define RIGHT '>'
#define TOP 100    // 循环次数extern void processbar(int rate);

源文件:processBar.c

#include<stdio.h>
#include"processBar.h"
#include<string.h>const char *lable = "|/-\\";
// v2版本:进度条如何被调用的?
char bar[NUM];
void processbar(int rate)
{if(rate < 0 || rate > 100)return;int len = strlen(lable);printf("[%-100s][%d%%][%c]\r",bar,rate,lable[rate%len]);fflush(stdout);bar[rate++] = BODY;if (rate < 100) bar[rate] = RIGHT;
}/* v1版本
void processbar(int speed)
{char bar[NUM];memset(bar, '\0',sizeof(bar)); // 将整个bar内容初始化为\0int len = strlen(lable);int cnt = 0;while(cnt <= TOP){printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt % len]);  // 没有\n,就没有立即刷新,因为显示器模式是行刷新fflush(stdout);bar[cnt++] = Str_style;if (cnt<TOP)bar[cnt] = RIGHT;     // 在这次循环中,前cnt行打印的是Str_style,然后cnt+1,在cnt+1行打印'>'usleep(speed);}printf("\n"); // 为了显示对应的命令行提示符// printf("hello processbar\n");
}
*/

main.c

#include"processBar.h"
#include<unistd.h>
// 调用方法一:通过回调函数来调用
typedef void (*callback_t)(int);
void downLoad(callback_t cb)
{int total = 1000;  // 总共的下载量int curr = 0;    // 当前下载量while(curr <= total){// 进行某种下载任务usleep(50000);   // 模拟下载时间int rate = curr*100/total;   // 更新进度cb(rate);   // 通过回调展示进度!curr +=10;   // 循环下载了一部分,更新进度}                   printf("\n");}int main()
{downLoad(processbar);//调用方法二:直接调用// int total = 1000;// int curr = 0;// while(curr <= total)// {
//  processbar(curr*100/total);// 进行某种下载任务//  curr +=10;// usleep(50000);// }// printf("\n");// processbar(50000);
//   int cnt = 10;
//   while(cnt>=0)
//   {// printf("%-2d\r",cnt);// fflush(stdout);//  cnt--;//  sleep(1);
// }
//   printf("\n");// printf("hello world"); // 1// fflush(stdout);// sleep(2);   //2return 0;
}

什么是git?

引入

  • 张三可以是新手程序员
  • 李四可以是老手程序员
  • 老师可以是产品经理 / 项目经理 

这个软件就是git  ---> 可以保存在本地仓库(在自己电脑下创建一个目录保存),也可以推送到远端仓库(百度云盘);

能够做版本管理的软件除了git还有svn(git是开源的!其他软件要收费)

git:

  • 具有网络功能的版本控制器;
  • 开源的;
  • client和server是一体的;

历史

有一家公司免费给Linux社区使用,但是有其他程序员尝试自己破解该软件 --->>> 自己研制处git!

基于git搞了一些商业化的网站   --- github   &&   gitee;

类似于基于Linux内核搞了一些商业化的OS   ---  Centos  Ubuntu等等;

操作

git的使用操作(以gitee为例)

1、新建仓库

其中.gitignore是忽略文件,里面保存了关于C语言的忽略文件,例如此时我们只想上传.c和.h文件,不想把.o或者.lib文件等上传上去,可以使用.gitgnore文件

 .gitgnore文件可以自己修改!

点击克隆 / 下载可以选择自己的下载方式!

2、把远端的仓库拉取到本地:

通过

git --help

查看git是否安装

git --version

看到git对应的版本

对于HTTPS协议:可以通过指令将远端仓库克隆到本地仓库!

先创建一个空文件夹用于之后的工作当作本地仓库!

例如:

git clone https://gitee.com/a-secret-side-dish/108_for_test.git

创建后通过ls-al可以查看隐藏的本地仓库!(.git即为本地仓库!

通过

ls .git -al

可以查看.git下有什么文件!

 

不建议手动对.git进行操作!

复习一下通过cp复制代码到本地

cp ../test_git_code/ . -rf
  • cp:这是复制文件和目录的命令(copy的缩写)。
  • ../test_git_code/:这是源路径,表示要复制的源文件或目录。.. 表示上级目录,test_git_code 是该目录的名称。
  • .:这是目标路径,表示当前工作目录。句点(.)表示当前目录。
  • -r:这是一个选项(flag),表示递归地复制目录及其内容。这意味着如果源路径是一个目录,它及其所有子目录和文件都会被复制。
  • -f:这是另一个选项,表示强制复制文件,即使目标文件已经存在,也不会提示用户确认和覆盖。

 再通过tree可以查看当前目录下的结构:

此时代码只是被拷贝到文件夹中,并没有被添加到仓库中!

通过指令:

git add .

将该目录下所有没有被添加到仓库的文件添加到仓库(仓库的暂存区)!

git commit -m "完成了两个版本的进度条"

提交日志到本地仓库!

  • 必须加上-m选项!
  • 必须加上"",其中""中写入一些提交的信息(也就是提交日志!)
  • 日志必须根据事实写!  --- > 不能胡写!

提交之后!通过

git push

将代码提交到远端! 

此时再次刷新仓库,可以发现代码已经提交到仓库! 而且日志内容已经被更新!

主要注意的是:

如果我们对文件进行增删改查!还需要进行git add!因为git不是对文件全部进行上次,而是对文件的变动进行更改!

git扩展:

1、自己的提交记录别人是可以看到的!

git log

通过git log可以查看历史的提交记录!

2、git status查看当前git仓库状态!

1、初始状态

当我们把文件都上传到仓库的时候,此时已经没有文件需要我们上传,显示的是nothing to commit ,工作区是干净的!

2、新建文件

如果我们此时创建一个test.c文件在当前本地仓库目录下,再次通过git status查看:

此时会建议你去将文件添加到本地仓库(git add test.c)

3、更新日志

此时我们将文件添加到本地仓库,再次通过git status查看:

建议我们将文件committed!

4、 进行推送

在我们进行commit之后,再次通过git status查看:

此时建议我们对文件进行推送(虽然都是显示没有东西可以进行commit,工作区干净!)

 5、上传后再次使用status:

此时显示的与第一次一样!

3、.gitignore文件

在.gitignore文件中,添加对应的后缀名(以*开头),提交代码时可以自动忽略该后缀名的文件!

此后再进行add、commit、push操作可自动忽略以.p和.pp为结尾的文件!

4、首次执行git会出下以下错误:

需要对git进行基本配置!

需要告知git自己的邮箱和用户名!

5、如果我们想要开源仓库 / 删除仓库

点击仓库右边的管理即可对仓库进行管理:

清空仓库:仓库还在,但是里面的内容清空

删除仓库:仓库直接消失

基本信息下面有开源选项!

如果git初次登录所需要设置(config)的邮箱与账号绑定的邮箱不一样,提交代码可能不会出现绿色标识!

Linux调试器-gdb

引入

  • 程序的发布方式有两种:debug和release两种模式!
  • Linux gcc / g++出来的二进制程序,默认采用的是release模式!
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项!
  • debug版本含有调试信息,release没有调试信息!

如果我们在Linux系统下想要查看一个可执行程序是debug版本,可以直接使用

gdb test

输入q退出! 

结尾处显示:no debugging symbols found 说明gcc默认采用的是release版本!

或者可以通过读取一个程序的二进制代码,查看它是否是debug版本!

readelf -S mycode

或者

readelf -S processbar | grep -i debug

如果需要强制输出为debug模式,需要加上-g选项!

此时编译生成的程序会出现debug信息!

debug发布的版本会比release版本体积更大!

因此:要是有gdb调试,必须要用debug发布,必须加上-g!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com