目录
1).gitignore 是 Git 版本控制中的一个配置文件,进行后缀过滤
一.进度条
一).补充:回车与换行
- CR ( - \r):光标回到行首,不换行。
- LF ( - \n):光标下移一行,不回到行首。

在计算机中 \n被默认设置为 \r + \n
二).行缓冲区
执行两段代码,观察不同
#include <stdio.h>
int main()
{
    printf("hello bite!\n");
    sleep(3);
    return 0;
}#include <stdio.h>
int main()
{
    printf("hello bite!");
    sleep(3);
    return 0;
}

有了上面的知识储备,我们来写一个倒计时程序
#include <stdio.h>
#include <unistd.h>
int main()
{
    int i = 10;
    while(i >= 0)
    {
        printf("%-2d\r", i); // \n
        fflush(stdout);
        i--;
        sleep(1);
    } 
    printf("\n");
    return 0;
}
三).进度条代码
#include "process.h"
#include <string.h>
#include <unistd.h>
void process_v1()
{
	char buffer[NUM];
	memset(buffer, 0, sizeof(buffer));
	const char* lable = "|/-\\";
	int len = strlen(lable);
	int cnt = 0;
	while (cnt <= 100)
	{
		printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt % len]);
		fflush(stdout);
		buffer[cnt] = STYLE;
		cnt++;
		usleep(5000);
	}
	printf("\n");
}但是对于上面的代码是无法运用到实际的场景的。我们的进度条要进行实际的分析,并不是简单的循环计算。
process.c
#include "process.h" #include <string.h> #include <unistd.h> #define NUM 101 #define STYLE '=' void FlushProcess(double total, double current) { char buffer[NUM]; memset(buffer, 0, sizeof(buffer)); const char* lable = "|/-\\"; int len = strlen(lable); static int cnt = 0; // 不需要自己循环填充# int num = (int)(current * 100 / total); // 11.0 / 1000 int i = 0; for (; i < num; i++) { buffer[i] = STYLE; } double rate = current / total; cnt %= len; printf("[%-100s][%.1f%%][%c]\r", buffer, rate * 100, lable[cnt]); cnt++; fflush(stdout); }
process.h
#pragma once #include <stdio.h> void FlushProcess(double total, double current);
main.c
#include "process.h" #include <stdio.h> #include <unistd.h> double total = 1024.0; double speed = 1.0; void DownLoad() { double current = 0; while (current <= total) { FlushProcess(total, current); // 下载代码 usleep(3000); // 充当下载数据 current += speed; } printf("\ndownload %.2lfMB Done\n", current); } int main() { DownLoad(); DownLoad(); DownLoad(); }
Makefile
SRC = $(wildcard * .c) OBJ = $(SRC:.c = .o) BIN = processbar $(BIN) :$(OBJ) gcc - o $@ $ ^ %.o: % .c gcc - c $ < .PHONY : clean : rm - f $(OBJ) $(BIN)


二.版本控制器Git
今天来学习一下如何在linux云服务器上使用git。我使用的是Linux的ubuntu系统来进行操作。
一).Git 安装与配置
# Ubuntu
sudo apt install git -y
# CentOS
sudo yum install git -y
# Arch Linux
sudo pacman -S git使用git version可以查看是否安装完成,查看git的版本
git version
二).创建仓库
这里我们使用gitee来进行操作


这里我们的仓库就创建好了
三).开始操作
1.简单流程
[工作目录] --git add--> [暂存区] --git commit--> [本地仓库] --git push--> [远程仓库]
      ▲                                     │
      │          git checkout -- <file>     │
      └─────────────────────────────────────┘
     2.配置公钥
1).身份认证
为确保提交的代码身份被 Gitee 正确识别,我们要先进行认证操作

git config --global user.name '球求了' 
git config --global user.email '1592266073@qq.com'
2). 生成 RSA 密钥
ssh-keygen -t rsa
3).获取 RSA 公钥内容,并配置到 SSH公钥 中
cat ~/.ssh/id_rsa.pub 
 

4).公钥添加测试
ssh -T git@git.oschina.net3.git clone
克隆现有仓库
git clone git@gitee.com:ball-begging/linux1.git
复制粘贴到Linux的命令行里(注意:要使用鼠标右击复制)



4.gitee 三板斧
1).git add
# 添加单个文件
git add test.c
# 添加所有修改文件
git add .
我们可以使用git status 查看当前状态
# 查看当前状态
git status
# 简略状态显示
git status -s
2).git commit
git commit 主要是将暂存区里的文件给提交到本地的仓库。
# 提交到本地仓库
git commit -m "提交说明"
# 组合操作(添加所有修改并提交)
git commit -am "组合提交说明"
请注意,提交声明不要乱写,都是可以查看的
# 查看提交历史
git log
# 图形化显示历史
git log --graph --oneline --all

3).git push
# 推送本地到远程
git push 

5.补充
1).gitignore 是 Git 版本控制中的一个配置文件,进行后缀过滤
避免将以下文件提交到仓库:
- 编译产物(如 - .class,- .exe,- .o)
- 本地配置文件(如 IDE 的 - .idea,- .vscode)
- 依赖目录(如 - node_modules,- venv)
- 日志文件(如 - .log,- .tmp)
- 敏感信息(如 - .env, 密钥文件)

2). 拉取远程最新代码并合并
git pull origin master
重新推送代码
git push origin master到这里,我们简单的git操作就完成了,更多的内容等待up慢慢学习完再进行总结写作。
三.调试器 - gdb/cgdb使用
gbd和cgbd我更推荐大家使用cgbd
| 功能 | GDB | CGDB | 
|---|---|---|
| 源码查看 | 需手动输入 list | 自动分屏显示源码 | 
| 断点管理 | 命令行操作 | 可视化设置/删除 | 
| 交互体验 | 纯命令行 | 类 IDE 分屏 | 
- 定位:基于 GDB 的文本界面调试工具,提供分屏界面(上方显示源码,下方输入 GDB 命令)。 
- 优势: - 直观查看源码和断点位置。 
- 支持快捷键操作(类似 Vim 的键位)。 
- 兼容所有 GDB 命令 
 
一).认识
- 程序的发布方式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的二进制程序,默认是 release 模式。
- 要使用cgdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,如果没有添加,程序无法被编译。
gcc mycmd.c -o mycmd   # 默认模式,不支持调试
gcc mycmd.c -o mycmd -g    # debug模式 可以调试
使用的代码:
 #include <stdio.h>
 int Sum(int s, int e)
{
    int result = 0;
    for(int i = s; i <= e; i++)
    {
      result += i;
    }
    return result;
}
 int main()
 {
   int start = 1;
   int end = 100;
   printf("I will begin\n");
   int n = Sum(start, end);
   printf("running done, result is: [%d-%d]=%d\n", start, end, n);
   return 0;
 }
二).常用指令
1.安装与启动
# Ubuntu
sudo apt install cgdb
cgdb my_program.exe          # 直接调试程序注意:cgdb后面跟的的是可执行文件,而不是源文件

2.常用快捷键
| 快捷键 | 说明 | 
|---|---|
| ESC | 切换到源码窗口 | 
| i | 切换到 CGDB 命令窗口 | 
| q | 退出调试 | 
3.运行程序
run / r	从头运行程序
start	停在 main 函数入口
list / l   显示源码,从上次位置开始
n / next 单步执行,不进入函数内部  
s / step 单步执行,进入函数内部  4.断点管理
break main / b main	在 main 函数开头设断点
b file.c:20	/ b 20    在 file.c 的第 20 行设断点
b func_name	        在函数 func_name 处设断点
info break / info b	查看所有断点

delete <num> / d <num>	删除指定编号的断点
注意:删除断点只能通过编号删除,不能指定行号删除

disable / enable <num>	禁用/启用断点
5.执行控制
| continue/c | 继续运行到下一个断点 | 
| next/n | 单步执行(不进入函数) | 
| step/s | 单步执行(进入函数) | 
| finish | 执行到当前函数返回 | 
| until | 运行到当前循环结束 | 
6.查看数据
| print var/p var | 打印变量值 | 
| ptype var | 查看变量类型 | 
| info locals / i locals | 查看当前栈帧的局部变量 | 
| info args | 查看函数参数值 | 
| backtrace/bt | 查看函数调用栈(堆栈回溯 | 
7.补充
- 1.watch:执行时监视一个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,CGDB 会暂停程序的执行,并通知使用者。
 
注意:如果你有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你.
- 2.set var确定问题原因

- 3.条件断点
1.添加条件断点

2.给已经存在的端点新增条件

注意:
条件断点添加常见两种方式:1. 新增 2. 给已有断点追加
注意两者的语法有区别,不要写错了。
新增: b 行号/文件名:行号/函数名 if i == 30(条件)
给已有断点追加:condition 2 i == 30, 其中2是已有断点编号,没有if
