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内容初始化为\0
  int 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);   //2
  return 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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值