Linux环境基础开发工具的使用_yum源_vim_Git控制器

目录

本节目标:

[一、Linux 软件包管理器 yum](#一、Linux 软件包管理器 yum)

1.什么是软件包

[2.关于 rzsz](#2.关于 rzsz)

3.注意事项

4.查看软件包

5.注意事项:

6.如何安装软件

说到这里,就可以取百度上康康有哪些好玩的指令:

二、Linux开发工具

Linux编辑器-vim使用

[1. vim的基本概念](#1. vim的基本概念)

[1.正常/普通/命令模式(Normal mode)](#1.正常/普通/命令模式(Normal mode))

[2.插入模式(Insert mode)](#2.插入模式(Insert mode))

[3.末行模式(last line mode)](#3.末行模式(last line mode))

[2. vim的基本操作](#2. vim的基本操作)

插入模式:

[3. vim正常模式命令集](#3. vim正常模式命令集)

插入模式

从插入模式切换为命令模式

移动光标

移动文件cp到指定目录下:

现在可以打开vim编辑器来尝试每一个选项:

删除文字:

复制:

替换

撤销上一次操作

更改

跳至指定的行

[4. vim末行模式命令集](#4. vim末行模式命令集)

列出行号

跳到文件中的某一行

查找字符

保存文件

离开vim

[5. vim操作总结](#5. vim操作总结)

三种模式

[6. 简单vim配置](#6. 简单vim配置)

配置文件的位置

常用配置选项,用来测试

使用插件

手把手配置:

Ubuntu:配置vimpuls

[1. 安装必要的依赖项](#1. 安装必要的依赖项)

[2. 克隆 Vimplus 项目](#2. 克隆 Vimplus 项目)

[3. 安装 Vimplus](#3. 安装 Vimplus)

[4. 配置 Python 环境](#4. 配置 Python 环境)

[5. 检查安装结果](#5. 检查安装结果)

[6. 可选:自定义配置](#6. 可选:自定义配置)

[7. 更新 Vimplus](#7. 更新 Vimplus)

[8. 卸载 Vimplus](#8. 卸载 Vimplus)

参考资料

vim实现多行注释:

三、⾃动化构建-make/Makefile

[3-1 背景](#3-1 背景)

makefile文件:

依赖关系

[3-4 推导过程](#3-4 推导过程)

编译

[• make是如何⼯作的,在默认的⽅式下,也就是我们只输⼊make命令。那么:](#• make是如何⼯作的,在默认的⽅式下,也就是我们只输⼊make命令。那么:)

[3-5 适度扩展语法](#3-5 适度扩展语法)

四、Linux第一个小程序-进度条

[1.回车和换行 - \r&&\n](#1.回车和换行 - \r&&\n)

2.缓冲区问题:

[2.1 测试代码:](#2.1 测试代码:)

简易百分比进度条:

第一代进度条:

第二代:模拟下载程序进度:

makefile:

main.c:

process.c:

process.h:

五、版本控制器Git

[5-1 版本控制器](#5-1 版本控制器)

[5-2 git 简史](#5-2 git 简史)

[5-3 安装 git](#5-3 安装 git)

[5-4 在 Gitee创建项⽬](#5-4 在 Gitee创建项⽬)

[1. 登陆成功后, 进⼊个⼈主⻚, 点击左下⽅的 新建创库 按钮新建项⽬](#1. 登陆成功后, 进⼊个⼈主⻚, 点击左下⽅的 新建创库 按钮新建项⽬)

2.创建仓库

3.在Liunx上拉下本地仓库:

复制云端仓库的https地址:

[git clone+云端仓库地址](#git clone+云端仓库地址)

可以看到不论是Linux下还是windows上都是一模一样的界面:

在第一次在Linux下进行git仓库上传的时候需要配置姓名和邮件:

[进行配置好姓名和邮件后,这里创建一个test.c 文件进行上传:](#进行配置好姓名和邮件后,这里创建一个test.c 文件进行上传:)

[1.git add ./*/[文件名] 这里就有点通配符的味道,一次性直接上传](#1.git add ./*/[文件名] 这里就有点通配符的味道,一次性直接上传)

[2.git commit -m "上传描述"](#2.git commit -m "上传描述")

[3.git push](#3.git push)

那么为了确保文件是否真的被上传成功,就可以直接区暂存区内看看,是否有新文件没有被上传:

[git status](#git status)

配置免密码提交:


本节目标:

  1. 学习 yum 工具,进行软件安装
  2. 掌握 vim 编辑器使用,学会 vim 的简单配置
  3. 掌握 gcc/g++ 编译器的使用,并了解其过程,原理
  4. 掌握简单 gdb 使用于调试
  5. 掌握简单的 Makefile 编写,了解其运行思想
  6. 编写自己的第一个 Linux 程序:进度条
  1. 学习 git 命令行的简单操作 , 能够将代码上传到 Github 上

一、Linux软件包管理器yum

1.什么是软件包

在 Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 .
但是这样太麻烦了 , 于是有些人把一些常用的软件提前编译好 , 做成软件包 ( 可以理解成 windows 上的安装程序) 放在一个服务器上 , 通过包管理器可以很方便的获取到这个编译好的软件包 , 直接进行安装 .
软件包和软件包管理器 , 就好比 "App" 和 " 应用商店 " 这样的关系 .
yum(Yellow dog Updater, Modified) 是 Linux 下非常常用的一种包管理器 . 主要应用在 Fedora, RedHat, Centos等发行版上 .

2.关于****rzsz

这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件 .
安装完毕之后可以通过 拖拽 的方式将文件上传过去

3.注意事项

关于 yum 的所有操作必须保证主机 ( 虚拟机 ) 网络畅通 !!!
可以通过 ping 指令验证
ping www.baidu.com

4.查看软件包

通过 yum list 命令可以罗列出当前一共有哪些软件包 . 由于包的数目可能非常之多 , 这里我们需要使用 grep 命令只筛选出我们关注的包. 例如:
yum list | grep lrzsz
结果如下 :
lrzsz.x86_64 0.12.20-36.el7 @base

5.注意事项**:**

软件包名称 : 主版本号 . 次版本号 . 源程序发行号 - 软件包的发行号 . 主机平台 .cpu 架构 .
"x86_64" 后缀表示 64 位系统的安装包 , "i686" 后缀表示 32 位系统安装包 . 选择包时要和系统匹配 .
"el7" 表示操作系统发行版的版本 . "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
最后一列 , base 表示的是 "软件源 " 的名称 , 类似于 " 小米应用商店 ", " 华为应用商店 " 这样的概念 .

6.如何安装软件

通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装:
sudo yum install lrzsz
yum 会自动找到都有哪些软件包需要下载 , 这时候敲 "y" 确认安装 .
出现 "complete" 字样 , 说明安装完成 .


注意事项 :
1.安装软件时由于需要向系统目录中写入内容 , 一般需要 sudo 或者切到 root 账户下才能完成 .
2.yum 安装软件只能一个装完了再装另一个 . 正在 yum 安装一个软件的过程中 , 如果再尝试用 yum 安装另外一个软件, yum 会报错 .
3.如果 yum 报错 , 请自行百度 .
如何卸载软件
仍然是一条命令 :
sudo yum remove lrzsz

说到这里,就可以取百度上康康有哪些好玩的指令:

https://blog.csdn.net/logic1001/article/details/136682885


二、Linux开发工具

Linux编辑器-vim****使用

vi/vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window 、 mac os 、windows。我们课堂上,统一按照 vim 来进行讲解。

1. vim****的基本概念

课堂上我们讲解 vim 的三种模式 ( 其实有好多模式,目前掌握这 3 种即可 ), 分别是命令模式( command mode )、插入模式(Insert mode )和底行模式( last line mode ),各模式的功能区分如下:

1.正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入 Insert mode 下,或者到 last line mode

2.插入模式(Insert mode)

只有在 Insert mode 下,才可以做文字输入,按「 ESC 」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

3.末行模式(last line mode)

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下, shift+: 即可进入该模式。要查看你的所有模式:打开vim ,底行模式直接输入
:help vim-modes
我这里一共有 12 种模式 :six BASIC modes 和 six ADDITIONAL modes.

2. vim****的基本操作

进入 vim, 在系统提示符号输入 vim 及文件名称后,就进入 vim 全屏幕编辑画面 :
$ vim test.c
正常模式:

不过有一点要特别注意,就是你进入 vim 之后,是处于 [ 正常模式 ] ,你要切换到 [ 插入模式 ] 才能够输入文字。
[ 正常模式 ] 切换至 [ 插入模式 ]
输入a
输入i
输入o

插入模式:


[ 插入模式 ] 切换至 [ 正常模式 ]
目前处于 [ 插入模式 ] ,就只能一直输入文字,如果发现输错了字 , 想用光标键往回移动,将该字删除,可以先按一下「ESC 」键转到 [ 正常模式 ] 再删除文字。当然,也可以直接删除。
[ 正常模式 ] 切换至 [ 末行模式 ]
「 shift + ; 」 , 其实就是输入「 : 」
退出 vim 及保存文件 , 在 [ 正常模式 ] 下,按一下「 : 」冒号键进入「 Last line mode 」 , 例如 :
: w (保存当前文件)
: wq ( 输入「 wq 」 , 存盘并退出 vim)
: q! ( 输入 q!, 不存盘强制退出 vim)
末行模式

回车后成功的保存退出!

3. vim****正常模式命令集

插入模式

1.按「 i 」切换进入插入模式「 insert mode 」,按 "i" 进入插入模式后是从光标当前位置开始输入文件;
2.按「 a 」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
3.按「 o 」进入插入模式后,是插入新的一行,从行首开始输入文字。

从插入模式切换为命令模式

按「 ESC 」键

移动光标

1.vim 可以直接用键盘上的光标来上下左右移动,但正规的 vim 是用小写英文字母
「 h 」、「 j 」、「 k 」、「l 」,分别控制光标左、下、上、右移一格
2.按「 G 」:移动到文章的最后
3.按「 $ 」:移动到光标所在行的 " 行尾 "
4.按「 ^ 」:移动到光标所在行的 " 行首 "
5.按「 w 」:光标跳到下个字的开头
6.按「 e 」:光标跳到下个字的字尾
7.按「 b 」:光标回到上个字的开头
8.按「 #l 」:光标移到该行的第 # 个位置,如: 5l,56l
9.按[ gg ]:进入到文本开始
10.按[ shift + g ]:进入文本末端
11.按「 ctrl 」 + 「 b 」:屏幕往 "前 " 移动一页
12.按「 ctrl 」 + 「 f 」:屏幕往 "后 " 移动一页
13.按「 ctrl 」 + 「 u 」:屏幕往"前"移动半页
14.按「 ctrl 」 + 「 d 」:屏幕往"后"移动半页

移动文件cp到指定目录下:

现在可以打开vim编辑器来尝试每一个选项:

删除文字:

「 x 」:每按一次,删除光标所在位置的一个字符
「 #x 」:例如,「 6x 」表示删除光标所在位置的 " 后面(包含自己在内) "6 个字符
「 X 」:大写的 X ,每按一次,删除光标所在位置的 " 前面 " 一个字符
「 #X 」:例如,「 20X 」表示删除光标所在位置的 " 前面 "20 个字符
「 dd 」:删除光标所在行
「 #dd 」:从光标所在行开始删除 # 行

复制:

「 yw 」:将光标所在之处到字尾的字符复制到缓冲区中。
「 #yw 」:复制 # 个字到缓冲区
「 yy 」:复制光标所在行到缓冲区。
「 #yy 」:例如,「 6yy 」表示拷贝从光标所在的该行 " 往下数 "6 行文字。
「 p」: 将缓冲区内的字符贴到光标所在位置。注意:所有与 "y" 有关的复制命令都必须与 "p" 配合才能完 成复制与粘贴功能。

替换

「 r 」:替换光标所在处的字符。
「 R 」:替换光标所到之处的字符,直到按下「 ESC 」键为止。

撤销上一次操作

「 u 」:如果您误执行一个命令,可以马上按下「 u 」,回到上一个操作。按多次 "u" 可以执行多次回复。
「 ctrl + r 」 : 撤销的恢复

更改

「 cw 」:更改光标所在处的字到字尾处
「 c#w 」:例如,「 c3w 」表示更改 3 个字

跳至指定的行

「 ctrl 」 + 「 g 」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

4. vim****末行模式命令集

在使用末行模式之前,请记住先按「 ESC 」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。

列出行号

「 set nu 」 : 输入「 set nu 」后,会在文件中的每一行前面列出行号。

跳到文件中的某一行

「 # 」 : 「 # 」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字 15 ,再回车,就会跳到文章的第15 行。
这个真很好用。

查找字符

「 / 关键字」 : 先按「 / 」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n 」会往后寻找到您要的关键字为止。
「 ? 关键字」:先按「 ? 」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n 」会往前寻找到您要的关键字为止。
问题:/ 和 ?查找有和区别?操作实验一下
实验结果就是:
/# ,按n,会一直往后找
?# ,按n,会一直往前找

保存文件

「 w 」 : 在冒号输入字母「 w 」就可以将文件保存起来

离开vim

「 q 」:按「 q 」就是退出,如果无法离开 vim ,可以在「 q 」后跟一个「 ! 」强制离开 vim 。
「 wq 」:一般建议离开时,搭配「 w 」一起使用,这样在退出的时候还可以保存文件

5. vim****操作总结

三种模式

正常模式
插入模式
底行模式

我们一共有 12 种总模式,大家下来可以研究一下。
vim 操作
打开,关闭,查看,查询,插入,删除,替换,撤销,复制等等操作。
练习:当堂口头模式切换练习

6.简单vim****配置

配置文件的位置

1.在目录 /etc/ 下面,有个名为 vimrc 的文件,这是系统中公共的 vim 配置文件,对所有用户都有效。
2.而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为: ".vimrc" 。例如, /root 目录下,通常已经存在一个.vimrc 文件 , 如果不存在,则创建之。
3.切换用户成为自己执行 su ,进入自己的主工作目录 , 执行 cd ~
4.打开自己目录下的 .vimrc 文件,执行 vim .vimrc

常用配置选项**,**用来测试

1.设置语法高亮 : syntax on
2.显示行号 : set nu
3.设置缩进的空格数为 4: set shiftwidth=4

使用插件

要配置好看的 vim ,原生的配置可能功能不全,可以选择安装插件来完善配置,保证用户是你要配置的用户,接下来:
安装 TagList 插件 , 下载 taglist_xx.zip , 解压完成,将解压出来的 doc 的内容放到~ /.vim/doc, 将解压出来的plugin 下的内容拷贝到~ /.vim/plugin
在~ /.vimrc 中添加 : let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 let
Tlist_Use_Right_Window=1
安装文件浏览器和窗口管理器插件 : WinManager
下载 winmanager.zip , 2.X 版本以上的
解压 winmanager.zip ,将解压出来的 doc 的内容放到~ /.vim/doc, 将解压出来的 plugin 下的内容拷贝到~/.vim/plugin
在~ /.vimrc 中添加 let g:winManagerWindowLayout='FileExplorer|TagList nmap wm :WMToggle<cr>
然后重启 vim, 打开 ~/XXX.c 或~ /XXX.cpp, 在 normal 状态下输入 "wm", 你将看到上图的效果。

手把手配置:

CentOs:

https://blog.csdn.net/wooin/article/details/1858917

Ubuntu:配置vimpuls

1. 安装必要的依赖项

在安装 Vimplus 之前,确保你的系统中有一些基本的依赖库。打开终端并运行以下命令:

sudo apt update sudo apt install -y git vim gcc g++ make cmake python3 python3-pip

2. 克隆 Vimplus 项目

在终端中执行以下命令,将 Vimplus 项目克隆到本地:

cd ~ git clone https://github.com/chxuan/vimplus.git

3. 安装 Vimplus

进入 vimplus 目录,并运行安装脚本:

cd ~/vimplus ./install.sh

此脚本会自动为 Vim 安装插件、主题和相关的配置。安装过程可能较慢,尤其是在安装插件时,请耐心等待。

4. 配置 Python 环境

Vimplus 默认使用 Python3,如果你希望配置 Python 环境支持,还需要安装 pynvim

pip3 install pynvim

5. 检查安装结果

安装完成后,打开 Vim 并检查是否有 Vimplus 的主题和插件:

vim

进入 Vim 后,可以使用 :PlugInstall 命令来手动安装或更新插件。

6. 可选:自定义配置

你可以在 ~/.vimrc 中添加或修改 Vimplus 的配置。例如,调整主题、快捷键、字体等。

7. 更新 Vimplus

如果想更新 Vimplus,可以执行以下命令:

cd ~/vimplus git pull ./update.sh

8. 卸载 Vimplus

如果需要卸载 Vimplus,可以使用以下命令:

cd ~/vimplus ./uninstall.sh

完成这些步骤后,你的 Vim 应该会有一个丰富的插件集成和增强的编辑体验。

参考资料

vim从入门到牛逼: https://github.com/wsdjeg/vim-galore-zh_cn

vim实现多行注释:

  • 进入可视行模式
    • 移动到需要注释的第一行。
    • 按下 Ctrl+v 进入块选择模式。
    • 使用方向键选择多行。
  • 插入注释符号
    • 按下 Shift+iI 进入插入模式。
    • 输入注释符号(例如 #)。
    • Esc 键,vim 会自动在每一行添加注释符号。

三、⾃动化构建-make/Makefile

3-1 背景

• 会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒
• ⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀
系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄
于进⾏更复杂的功能操作
• makefile带来的好处就是⸺"⾃动化编译",⼀旦写好,只需要⼀个make命令,整个⼯程完全
⾃动编译,极⼤的提⾼了软件开发的效率。
• make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这
个命令,⽐如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可⻅,makefile
都成为了⼀种在⼯程⽅⾯的编译⽅法。
• make是⼀条命令,makefile是⼀个⽂件,两个搭配使⽤,完成项⽬⾃动化构建。

makefile文件:

依赖关系

• 上⾯的⽂件myproc,它依赖myproc.c
依赖⽅法
• gcc -o myproc myproc.c ,就是与之对应的依赖关系
项⽬清理
• ⼯程是需要被清理的
• 像clean这种,没有被第⼀个⽬标⽂件直接或间接关联,那么它后⾯所定义的命令将不会被⾃动
执⾏,不过,我们可以显⽰要make执⾏。即命令⸺"make clean",以此来清除所有的⽬标
⽂件,以便重编译。
• 但是⼀般我们这种clean的⽬标⽂件,我们将它设置为伪⽬标,⽤ .PHONY 修饰,伪⽬标的特性
是,总是被执⾏的。
• 可以将我们的 hello ⽬标⽂件声明成伪⽬标,测试⼀下
📌 结论:
.PHONY:让make忽略源⽂件和可执⾏⽬标⽂件的M时间对⽐

但是上面的操作,不能很好的看到可执行文件执行的过程,和被链接的过程,那么就要考虑手动打印的方法:

获取所有源文件的 .c

只需要将SRC里面的.c 都换成.o即可:

3-4 推导过程

cpp 复制代码
myproc:myproc.o
gcc myproc.o -o myproc
myproc.o:myproc.s
gcc -c myproc.s -o myproc.o
myproc.s:myproc.i
gcc -S myproc.i -o myproc.s
myproc.i:myproc.c
gcc -E myproc.c -o myproc.i
.PHONY:clean
clean:
rm -f *.i *.s *.o myproc

编译

cpp 复制代码
$ make
gcc -E myproc.c -o myproc.i
gcc -S myproc.i -o myproc.s
gcc -c myproc.s -o myproc.o
gcc myproc.o -o myproc

• make是如何⼯作的,在默认的⽅式下,也就是我们只输⼊make命令。那么:

  1. make会在当前⽬录下找名字叫"Makefile"或"makefile"的⽂件。
  2. 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的例⼦中,他会找到 myproc 这个⽂件,并把这个⽂件作为最终的⽬标⽂件。
  3. 如果 myproc ⽂件不存在,或是 myproc 所依赖的后⾯的 myproc.o ⽂件的⽂件修改时间要
    ⽐ myproc 这个⽂件新(可以⽤ touch 测试),那么,他就会执⾏后⾯所定义的命令来⽣成
    myproc 这个⽂件。
  4. 如果 myproc 所依赖的 myproc.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为
    myproc.o ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 myproc.o ⽂件。(这有点像⼀
    个堆栈的过程)
  5. 当然,你的C⽂件和H⽂件是存在的啦,于是 make 会⽣成 myproc.o ⽂件,然后再⽤
    myproc.o ⽂件声明 make 的终极任务,也就是执⾏⽂件 hello 了。
  6. 这就是整个make的依赖性,make会⼀层⼜⼀层地去找⽂件的依赖关系,直到最终编译出第⼀个⽬标⽂件。
  7. 在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并 报错,⽽对于所定义的命令的错误,或是编译不成功,make根本不理。
  1. make只管⽂件的依赖性,即,如果在我找了依赖关系之后,冒号后⾯的⽂件还是不在,那么对不起,我就不⼯作啦。

3-5 适度扩展语法

cpp 复制代码
BIN=proc.exe # 定义变量
CC=gcc
#SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名
SRC=$(wildcard *.c) # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名
OBJ=$(SRC:.c=.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表
LFLAGS=-o # 链接选项
FLAGS=-c # 编译选项
RM=rm -f # 引⼊命令
$(BIN):$(OBJ)
@$(CC) $(LFLAGS) $@ $^ # $@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表
@echo "linking ... $^ to $@"
%.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同
名.o
@$(CC) $(FLAGS) $< # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。
@echo "compling ... $< to $@" # @:不回显命令
.PHONY:clean
clean:
$(RM) $(OBJ) $(BIN) # $(RM): 替换,⽤变量内容替换它
.PHONY:test
test:
@echo $(SRC)
@echo $(OBJ)

四、Linux****第一个小程序-进度条

1.回车和换行 -****\r&&\n

2.缓冲区问题:

所以在程序休眠时,没有"\n" 那么就会放在缓冲区里面,没有被刷新到显示屏上,但是如果加上"\n" 回车换行,那么缓冲区里面的内容会刷新在显示屏上。

2.1 测试代码:

要让每一个字符都在同一个位置进行打印,那么就说明是只回车,不换行;
当前进行回车换行,就达不到一直在同一个位置进行打印的效果:

但是只进行换行的时候,打印的内容在缓冲区内没有被刷新出来,就会造成最后打印不出结果的问题:

当进行手动刷新的时候就可以得到缓存区里面的值被打印出来:

要考虑如果当数字出现两位以上怎么办的情况:

3.想写一个什么样的进度条

创建好makefile:

进行修改process.c:

然后进行只回车,不换行进行刷新缓冲区:fflush(stdout);

简易百分比进度条:

第一代进度条:

第二代:模拟下载程序进度:

makefile:
cpp 复制代码
  1 SRC=$(wildcard *.c)
  2 OBJ=$(SRC:.c=.o)
  3 BIN=processbar
  4      
  5 $(BIN):$(OBJ)
  6     gcc -o $@ $^
  7 %.o:%.c
  8     gcc -c $< -std=c99                                                                                                                                                                                                          
  9      
 10 .PHONY:
 11 clean:
 12     rm -f $(OBJ) $(BIN)
 13      
                               
main.c:
cpp 复制代码
 //main.c                                                                                                                                                                                                            
  1 #include "process.h"
  2 #include <stdio.h>
  3 #include <unistd.h>
  4      
  5 double total = 1024.0;
  6 double speed = 1.0;
  7      
  8 void DownLoad()
  9 {    
 10     double current=0;
 11     while(current<=total)
 12     {
 13         FlushProcess(total,current);
 14         //下载代码
 15         usleep(3000);//充当下载数据
 16         current+=speed;
 17     }
 18     printf("\ndownlocad %.2lfMB Done\n",current);                                                                                                                                                                               
 19 }    
 20      
 21      
 22      
 23 int main()
 24 {    
 25     DownLoad();
 26     return 0;
 27 }    
~                                                                                                                                                                                                                                   
~               
process.c:
cpp 复制代码
 #include "process.h"                     
  2 #include <string.h>                      
  3 #include <unistd.h>                      
  4                                          
  5 #define NUM 101                          
  6 #define STYLE '#'                        
  7                                          
  8                                          
  9 FlushProcess(double total,double current)
 10 {                                        
 11     char buffer[NUM];                    
 12     memset(buffer,0,sizeof(buffer));     
 13     const char* lable="|/-\\";                                             
 14     int len=strlen(lable);                                                 
 15                                                                            
 16     static int cnt=0;                    
 17                                          
 18     //不需要自己循环填充#                
 19     int num = (int) (current*100/total);                                                                                                                                                                                        
 20     for(int i=0;i<num ;i++)              
 21     {                                    
 22         buffer[i]=STYLE;                 
 23     }                                    
 24                                          
 25     double rate=current/total;           
 26                                          
 27     cnt%=len;                            
 28     printf("[%-100s][%.lf%%][%c]\r",buffer,rate*100,lable[cnt]);
 29     cnt++;                               
 30     fflush(stdout);                      
 31                                          
 32 }                                        
 33                                          
 34                                          
 35                                          
 36 void process_v1()                        
 37 {                                        
 38     char buffer[NUM];                    
 39     memset(buffer,0,sizeof(buffer));     
 40     const char* lable="|/-\\";           
 41     int len=strlen(lable);               
 42                                          
 43     int cnt=0;                           
 44     while(cnt<=100)                      
 45     {                                    
 46         printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]);
 47         fflush(stdout);                  
 48         buffer[cnt]=STYLE;               
 49         cnt++;                           
 50         usleep(50000);                   
 51     }                                         
 52     printf("\n");                       
 53 }                                       
~                                        
process.h:
cpp 复制代码
 #pragma once
  2  
  3 #include <stdio.h>
  4  
  5 void process_v1();
  6  
  7  
  8 FlushProcess(double total,double current);    

第二代模拟下载进度条:

五、版本控制器Git

不知道你⼯作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防⽌⽂档丢失,更改
失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,⽐如:
"报告-v1"
"报告-v2"
"报告-v3"
"报告-确定版"
"报告-最终版"
"报告-究极进化版"
...
每个版本有各⾃的内容,但最终会只有⼀份报告需要被我们使⽤ 。
但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越
多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么
吗?
⽂档如此,我们写的项⽬代码,也是存在这个问题的!!

5-1 版本控制器

为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
⽬前最主流的版本控制器就是 Git。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!

5-2 git 简史

同⽣活中的许多伟⼤事物⼀样,Git 诞⽣于⼀个极富纷争⼤举创新的年代。
Linux 内核开源项⽬有着为数众多的参与者。 绝⼤多数的 Linux 内核维护⼯作都花在了提交补丁和保存归档的繁琐事务上(1991−2002年间)。 到 2002 年,整个项⽬组开始启⽤⼀个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使⽤ BitKeeper 的权⼒。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 LinusTorvalds)基于使⽤ BitKeeper 时的经验教训,开发出⾃⼰的版本系统。 他们对新的系统制订了若⼲
• ⽬标
• 速度
• 简单的设计
• 对⾮线性开发模式的强⼒⽀持(允许成千上万个并⾏开发的分⽀)
• 完全分布式
有能⼒⾼效管理类似 Linux 内核⼀样的超⼤规模项⽬(速度和数据量)
⾃诞⽣于 2005 年以来,Git ⽇臻成熟完善,在⾼度易⽤的同时,仍然保留着初期设定的⽬标。 它的速度⻜快,极其适合管理⼤项⽬,有着令⼈难以置信的⾮线性分⽀管理系统。

5-3 安装 git

CentOs:
sudo yum install git
Ubentu:
sudo apt install git

5-4 在 Gitee创建项⽬

注册账号
这个⽐较简单, 参考着官⽹提⽰即可. 需要进⾏邮箱校验.
创建项⽬

1. 登陆成功后, 进⼊个⼈主⻚, 点击左下⽅的 新建创库 按钮新建项⽬

2.创建仓库


3.在Liunx上拉下本地仓库:

复制云端仓库的https地址:
git clone+云端仓库地址
可以看到不论是Linux下还是windows上都是一模一样的界面:


这个.git 才是真正的本地仓库,每次进行更新的时候只会更新修改的位置,会记录每一次更新。

在第一次在Linux下进行git仓库上传的时候需要配置姓名和邮件:

git config --global user.name "Your Name"

git config --global user.email "your_email@example.com"

进行配置好姓名和邮件后,这里创建一个test.c 文件进行上传:

1.git add ./*/[文件名] 这里就有点通配符的味道,一次性直接上传

2.git commit -m "上传描述"

是将文件放入暂存区内:

这里的描述千万别乱写,以后时间长了,直接导出来所有文件,乱写的描述一眼就看到了;

3.git push

将暂存区内的文件进行上传到云端gitee的仓库

也就是这三步能够完成所有文件或者文件夹的同步更新;

此时可以看到test.c文件被成功上传;

那么为了确保文件是否真的被上传成功,就可以直接区暂存区内看看,是否有新文件没有被上传:

git status

假如存在有的文件没有被上传成功,那么就可以知道暂存区内还有文件;

另外就是windows 跟 Linux 同时可以对gitee的同一个仓库进行操作和修改,那么当win进行操作后,Linux就会传输失败,同样win也是;那么怎么解决呢?
其实这就说明win操作后,Linux的这个本地仓库就不是最新的仓库,只要重新更新一下云端仓库就可以正常继续上传了:win跟Linux产生了冲突;

git pull 来更新一下最新的仓库即可

配置免密码提交:

https://blog.csdn.net/camillezj/article/details/55103149

总结一下吧~总结不易,本章对我的收获和学习巨大,希望对你也有帮助!!!

相关推荐
mit6.824几秒前
[Redis#0] iredis: linux上redis超好用的环境配置
linux·redis·后端
Allen Roson6 分钟前
CListCtrl::InsertItem和临界区导致程序卡死
c++·windows·insertitem卡死·clistctrl插入项目·临界区死锁
陌小呆^O^8 分钟前
Cmakelist.txt之Linux-redis配置
linux·运维·redis
酒鬼猿11 分钟前
C++初阶(十五)--STL--list 的深度解析与全面应用
开发语言·c++
gma99912 分钟前
JSONCPP 数据解析与序列化
开发语言·前端·javascript·c++
ernesto_ji16 分钟前
Linux中,防火墙基本操作指令
linux·运维·网络
以卿a32 分钟前
C++ 日期计算器的实现(运算符重载)
java·开发语言·c++
2401_840759761 小时前
2062:【例1.3】电影票(http://ybt.ssoier.cn:8088/problem_show.php?pid=2062)
c++
程序员与背包客_CoderZ1 小时前
C++设计模式——Singleton单例模式
c语言·开发语言·c++·单例模式·设计模式
丶Darling.1 小时前
MIT 6.S081 | 操作系统 | Lab1: Xv6 and Unix utilities
linux·服务器·c语言·操作系统·unix·lab·mit 6.s081