目录
一.Linux 软件包管理器 yum
1.什么是软件包
2.centos 7中安装形式
3.yum安装好处:
4.yum工具的常用选项
(1)yum list | grep sl
软件包信息介绍:
(2)sudo yum install sl ——安装软件
(3)sudo yum remove sl ——卸载软件
5.yum相关命令
二.Linux编辑器-vim
1.vim是什么?
2.为什么要学vim?
3.vim的三种模式
(1)底行模式下的操作
(2)三种模式转换关系
4.命令模式下的文本批量化操作:
5.批量化操作
(1)批量化注释-视图模式
(2)批量化替换
6.整个代码编译的流程
三.Linux编译器-gcc/g++使用
g++下载命令:sudo yum install -y gcc-c++
编译过程:
gcc test.c -o mytest 把文件编译后放进 mytest中
1.预处理
预处理,编译,汇编,链接
2.头文件和库文件
3.动态/静态链接
下载代码:
四.Linux调试器-gdb调试器 使用
1.gdb binFile 退出: ctrl + d 或 quit 调试命令:
(1)gcc hello.c -o hello_g -g 转为debug版本
(2)gdb hello_g 进行调试
(3)gdb下的list命令显示代码,简称 l
回车默认是继续执行上一条指令,l 0 后 多次回车就会显示全部代码
(4)b 15 - 打断点在第15行(breakpoint), info b- 显示断点信息
(5) d 1——1是第一个断点的断点序号 - 删除第几个断点(delete)
(6)r - 重新从头开始执行程序(run),会直接跳到第一个断点处, c - 从一个断点,之间跳转到另一个断点(continue) 相当于F5
(7)p 变量名 - 显示某变量的值
(8)display 变量名/&变量名 - 持续显示某变量的值/地址(相当于监视)
undisplay 序号 - 删除第几个变量名/&变量名
(9)n - 逐过程=F10(next),s - 逐语句=F11(step)进入函数
(10)until 行号 直接跳到第几行
(11)finish 完成当前函数并跳出
(12)bt——查看调用堆栈
五.Linux项目自动化构建工具-make/Makefifile
1.make与makefile:
2.makefile使用:
make的顺序
3..PHONY 解释
makefile是如何识别我的exe/bin文件是新的还是旧的呢? ?
4.gcc -o $@ $^
5.makeflie中编不过就加上 -std=c99
六.进度条小程序
1.缓冲区
2.回车\r vs换行
3.倒计时程序:
4.进度条(需要usleep)
七.git
1.git,gitee,github介绍
2.git历史
3.如何使用gitee?
(1)git pull同步文件
4.注意事项
b:配置一下你的用户名和邮箱,目的:让文件内容可追溯。
git log可以查看作者信息:
C. gitignore:黑名单
1.源码安装
2. rpm包安装
3.yum安装
1.不用编译源码
2.不用解决软件的依赖关系(此处作为了解)
如果我要知道我要安装什么软件,用yum可以很简单^
我们要安装别人的软件:
1.需要别人先把代码给我编译成为可执行程序
2.需要有人将编好的软件,放在用户能下载的地方(官网,应用软件市场)
Linux也是一样的!
手机安装示例:
yum安装示例:yum类似于手机上的应用市场APP,迅雷这些安装软件
install 表示安装软件包
list 列出所有可供安装的软件包
search 搜索包含指定关键字的软件包
remove 卸载指定的软件包
yum list:把yum包含的软件包都列出来。
yum list | grep sl :把yum包含的软件包中还有sl的软件包都列出来。
[zsh@ecs-78471 lesson6]$ yum list | grep sl
cyrus-sasl-lib.x86_64 2.1.26-23.el7 @anaconda
openssl.x86_64 1:1.0.2k-24.el7_9 @updates
openssl-libs.x86_64 1:1.0.2k-24.el7_9 @updates
python-slip.noarch 0.4.0-4.el7 @anaconda
python-slip-dbus.noarch 0.4.0-4.el7 @anaconda
rsyslog.x86_64 8.24.0-57.el7_9.1 @updates
slang.x86_64 2.2.4-11.el7 @anaconda
NetworkManager-adsl.x86_64 1:1.18.8-2.el7_9 updates
NetworkManager-fortissl.x86_64 1.2.8-7.el7 epel
NetworkManager-fortissl-gnome.x86_64 1.2.8-7.el7 epel
aisleriot.x86_64 1:3.22.2-1.el7 epel
anope-openssl.x86_64 2.0.10-1.el7 epel
apr-util-openssl.x86_64 1.5.2-6.el7 base
autocorr-sl.noarch 1:5.3.6.1-25.el7_9 updates
batik-slideshow.noarch 1.8-0.12.svn1230816.el7 base
bitten-slave.noarch 1:0.6-3.el7 epel
cgnslib.x86_64 3.2.1-4.el7 epel
cgnslib-devel.x86_64 3.2.1-4.el7 epel
cinnamon-translations.noarch 3.6.2-2.el7 epel
csslint.noarch 0.10.0-2.el7 epel
cyrus-sasl.i686 2.1.26-24.el7_9 updates
cyrus-sasl.x86_64 2.1.26-24.el7_9 updates
cyrus-sasl-devel.i686 2.1.26-24.el7_9 updates
cyrus-sasl-devel.x86_64 2.1.26-24.el7_9 updates
cyrus-sasl-gs2.i686 2.1.26-24.el7_9 updates
………………
或sudo yum install sl.x86_64 ——安装sl
需要安装的几个软件:
①sudo yum install sl
②sudo yum install -y lrzsz
③sudo yum install -y epel-release(准官方服务器列表)
④sudo yum install -y vim
sudo yum remove sl ——卸载sl这个软件
yum makecache命令的功能是将服务器的软件包信息缓存到本地(yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用 yum makecache将软件包信息缓存到本地,使用 yum clean all 清理老旧的缓存信息。)
yum search命令可以在所有软件包中搜索包含有指定关键字的软件包
yum clean all 命令可以清除缓存中老旧的头文件和软件包
yum -y update:升级所有包同时,也升级软件和系统内核;
yum -y upgrade:只升级所有包,不升级软件和系统内核,软件和内核保持原样。
是一个编辑器
(1)只能用来写代码
(2)功能强大的多模式的编辑器
有时候,需要我们在生成环境下,需要你快速的定位问题,甚至需要你快速的修改代码!
在末行模式下,键入:wq 保存并退出编辑,就算没有修改也会写入,并修改文件时间属性
在末行模式下,键入:q! 强制退出编辑,但并不保存当前修改
在末行模式下,键入:x! 保存并退出编辑,仅当文件有修改时会保存,并修改文件时间属性
在编辑模式下,键入”ESC”键并非直接退出vi编辑,而是用于返回普通模式
温馨提示:任何模式想回到命令模式无脑esc
yy: 复制当前行,nyy——复制包括光标所在行的下面n行内容
p: 粘贴到当前行的后面,np——粘贴n次已复制的内容
dd: 剪切(删除)当前行,ndd——剪切包括光标所在行的下面n行内容
u: 撤销刚刚的操作(相当于vs下的ctrl+z)
ctrl+r: 针对u操作,再次进行撤销(相当于vs下的ctrl+y)
shift+g:(就是G) 光标快速定位到文本末尾
gg: 快速的将光标定位到文本的最开始
n+shift+g: 光标快速定位到文本的第n行
shift+4:(4就是$) 光标快速定位到文本行的末尾
shift+6: (^) 光标快速 定位到文本行的开始 $^:通常叫锚点
w,b: 向后(w),向前(b)在一行以单词为单位进行光标移动
h,j,k,l: h左,j下,k上,l右(光标的移动上下左右移动)
shift + ~ (esc下面) : ~ 大小写快速切换
r+输入字符: 替换光标所在的字符为输入字符, 支持nr——(把包括光标在内的后n个字符替换为n个相同字符)
shift+r:(R) 批量化替换(写一个就覆盖一个原有内容)
x: 删除光标所在的字符,nx——删除包括光标在内的后n个字符
s+AAA+yyy+g vim编辑器中,将字符AAA全部替换成yyy(g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次)
结论:vim更适合处理大型项目或者文件。
Esc到命令模式下在下面操作
批量化注释:输入法小写情况下,ctrl+v,hjkl选中区域,切换输入法大写,输入i,再输入 //, 最后esc即可
去注释:命令模式下,小写,ctrl + v,hjkl选中区域(注释区域),注意l向右移动直到选中两列 /,d。相当于删除操作。
vim编辑文件,cat读文件,gcc mytest.c 编译文件,生成a.out文件,./a.out执行文件即可。
gcc只能编译c语言,g++能编译c语言和c++
gcc -E test.c -o test.i
vim test.i //进入test.i
-E:从现在开始给我进行程序的翻译,当预处理完成,就停下来!
-o test.i:把预处理后的结果放进test.i中
如何查看预处理过程:底行模式下输入vs test.i 进入预处理后的结果
-E -S -c 可记作 ESc ,文件后缀 .i .s. o 记作 iso
头文件: 给我们提供了可以使用的方法,所有的开发环境,具有语法提示,本质是通过头文件帮我们搜索的! (比如给我们提供了printf这个方法)
库文件:给我们提供了可以使用的方法的实现,以供链接,形成我们自己的可执行程序!(比如给我们提供了printf这个方法的底层实现)
动态链接:自己的可执行程序的执行方法直接去库中找方法对应的程序执行(不发生拷贝,只发生关联)
优点:大家共享一个库,可以节省资源
缺点:一旦库缺失,会导致几乎所有的程序失效!
动态库:libxxx.so
静态链接:把库中的方法代码,直接拷贝到自己的可执行程序中去(发生拷贝,exe最终与库无关)
优点:不依赖任何库,程序可以独立执行
缺点:浪费资源
静态库:libxxx.a
gcc. g+ +编译的时候默认的链接模式:动态链接 (若想转为静态链接-需要加上static)
gcc/g++发布软件的默认方式: release (若想转为debug-需要加上 -g选项)
默认 gcc test.c -o mytest 是动态链接,gcc test.c -o mytest -static 是静态链接
更推荐动态链接
默认一般而言,都没有自带静态库|
[root@ecs-78471 ~]# sudo yum install -y glibc-static
[root@ecs-78471 ~]# sudo yum install -y libstdc++-static
vim:编辑器。gcc/g++:编译器。gdb:调试器-只能调试debug方式发布的软件 必须加-g选项
常用选项
①linux中默认生成的可执行程序是release版本,无法调试。直接gdb hello(默认形成的可执行程序无法调试)无法调试:
②debug版本比release版本大小要大,多出一些调试信息。
③gcc hello.c -o hello_g -g 中的-g是把release版本转为debug版本,debug版本可以调试。
c99就用:gcc hello.c -o hello_g -g -std=c99
l 0:从第0行开始显示
(这个c语言代码是计算1~100相加,相加是5050)
p result:查看result这个变量的值;p &result:查看result这个变量的地址;
(这里的1:res=5050 是之前的display长显示)
s进入函数AddToTop,调用堆栈 显示main现在走到17行了,AddToTop函数停在第5行,但未执行第5行
make是一个命令
makefile是一个文件
makefile:在当前路径下的一个普通文件
1.依赖关系(我是爸爸的儿子)
2.依赖方法(所以爸爸给我打钱) 达到打钱的目的
目的:形成可执行程序
(1)依赖关系: mytest -> mytest.c
(2)依赖方法: gcc mytest.c -o mytest
touch一个Makefile(大小写都可),编写Makefile
mytest: mytest.c ①行 是依赖关系,mytest是目标文件,mytest.c是依赖文件列表
gcc mytest.c -o mytest ②行 是依赖方法(以tab水平制表符起头, 是tab的意思)
.PHONY:clean ③行 伪文件(下有解释)
clean: ④行 是孤儿式的依赖关系
rm -f mytest ⑤行 是依赖方法
写好后,以后直接make就可以按照依赖关系和方法进行编译,编译出可执行文件mytest。
删除要在Makefile中写伪文件③④⑤行,然后直接make clean就可以删除,如果直接rm可能会导致删除源文件,不能直接rm。
当交换mytest和clean的先后顺序后:make默认只会形成第一个目标文件,执行该依赖关系的依赖方法,如果把clean放在前面,单独make就是执行clean
.PHONY:makefile语法格式中的一个关键字
clean被. PHONY修饰时,表明:总是被执行的
总是被执行的:无论目标文件是否新旧,照样直接执行依赖关系!
总是不被执行:如果文件已经执行过依赖方法,是新文件,makefile自动识别文件如果是最新文件,就不再执行依赖方法,因为这浪费时间浪费资源
建议把clean写成 总是被执行的 ,不建议把mytest设置成总是被执行,mytest设置成总是不被执行
总是不被执行 的示例:make生成可执行程序mytest一次以后,mytest是最新文件,makefile自动识别文件mytest是最新文件,再次make就不再生成mytest文件了,下面解释makefile如何自动识别的。
先看补充内容
———————————————————————————————————————补充内容
stat mytest查看文件属性,linux下的文件通常有三个时间:
Access(访问时间):由于访问/修改内容/修改属性这些操作中,访问是最频繁的操作,如果每次访问或cat查看都修改访问时间的数据 效率低,所以linux内核设置的是积累一定的访问次数才会改变一次访问时间。
Modify(文件内容改变的时间):对文件内容修改,就会改变Modify时间
Change(文件属性改变时间):对文件属性修改,就会改变Change时间。对文件内容修改同时也会改变文件属性,则对文件内容修改,也会改变Change时间。
————————————————————————————————————————
现在回答:makefile是如何识别我的exe/bin文件是新的还是旧的呢? ?
答:根据对比源文件和可执行程序的最近修改时间(Modify),评估要不要重新生成。源文件mytest.c 的modify时间在未修改的情况下一定是比 可执行程序mytest 的modify时间早,如果makefile发现源文件mytest.c 的modify时间 早于 可执行程序mytest 的modify时间,说明mytest.c未被修改过,此时 可执行程序mytest 也是最新的,则不会再次生成可执行程序;如果makefile发现源文件mytest.c 的modify时间 后于 可执行程序mytest 的modify时间,说明mytest.c被修改过,此时 可执行程序mytest 是旧文件,则会再次生成可执行程序;
总是被执行的:无论目标文件是否新旧,照样直接执行依赖关系!
mytest: mytest.c
gcc -o $@ $^ $@ 代表目标文件mytest,$^ 代表依赖文件列表 mytest.c
.PHONY:clean
clean:
rm -f mytest
myshell:myshell.c
gcc -o $@ $^ -std=c99 //编不过就加-std=c99
.PHONY:clean
clean:
rm -f myshell
示例:
上面代码的现象:有\n时,会立马显示hello 104,然后睡眠2秒结束;无\n时,会先睡眠2秒,然后显示hello 104结束;无\n时,执行顺序依然是从上到下,printf hello 104 先执行了,只是hello 104 没立即显示在屏幕上。因为无\n时在睡眠2秒期间,hello 104 先存在了缓冲区中,所以没立即显示在屏幕上。为什么呢?
缓冲区的理解:就是一段内存空间。
刷新策略:行刷新。 解释:程序中的打印数据先存到缓冲区中,等暂满一行就立马将内存中的空间显示出来,怎么定义一行内容呢?规定:“hello world\n” \n 之前包含\n称为 一行内容
所以结论就是:“hello world\n”是一行内容,会直接显示;“hello world”不是一行内容,会先存到缓冲区中,sleep完才显示。
不想用\n,就想让你的数据立马刷新!用flush(stdout)
回车(\r):将光标回到当前行的最开始
换行:新起一行
\n:回车\r+换行
\n会刷新缓冲区,\r不会刷新缓冲区。
sleep的头文件 #include
如果不写 fflush ,那么\r不会刷新缓冲区,屏幕上不会打印任何东西。
fflush(stdout) ; 作用是立即刷新缓冲区。
usleep:1s=1000ms=100 0000 微秒 microsecond 例如:usleep(10000) 就是休眠10ms。
usleep的头文件也是 #include
进度条总代码:
printf ("加载中: \033[46;34m%-100s\033 [0m[%d%%] [%c]\r", bar, cnt, lable[cnt%4]); 解释:
蓝色部分是进度条,橘黄色部分是加载值和转动光标,灰色是回车,其余部分都是颜色输出(格式如下)
git是linux之父 雷纳斯托瓦兹 所写
什么是git:git是一个软件工具,版本控制器(类似于百度云盘):版本控制程序+网络(因为本地存储有丢失风险,所以网络 )
gitee,github基于git工具,搭建起来的网站
写git的作者和写linux操作系统的作者都是雷纳斯托瓦兹。
1. 建立gitee仓库
2. git clone
3. git add(git add *是添加所有文件,git add .是添加当前目录下未添加的文件)
4. git commit -m”写好你的日志”
5. git push
建立仓库
如果在网页的gitee中修改了已提交文件的内容,远端和本地内容不相同,则下一次再提交新文件会出错,需要先把以前的文件同步,git pull同步文件
a. sudo yum install -y git 下载git
b.第一次使用git的时候,可能会让你配置一下你的用户名和邮箱
C. gitignore:黑名单
别人看不懂你的文件时,方便别人联系你。
gitignore中所写的带后缀文件不得提交,还可以自己写上哪些后缀文件是不可提交上去的
*代表所有文件,*.x意思是所有后缀.x 的文件不可提交