一yum
1理解
有这样的一个情景:
我们在Linux中在文档中找到所需要的指令后去进行操作时,有时侯在执行该指令时Linux告诉我们:在当前的环境中找不到该指令,无法执行。这是我们就要用指令:yum install -y 指令名 来进行下载。那么在这个过程中,yum是不是充当一个什么样的角色?
在日常生活里,如果我们要刷抖音时,手机里没有对应的软件,我们可以选择到手机提供的软件应用商城去下载。而yum在Linux中也是充当着软件应用商城的角色
2生态
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
但在不同环境中程序的源代码不一定每次都能通过编译得到可执行程序(各种语法的冲突),为了解决这种问题,就要一些人(用爱发电)把程序的源代码在不同的环境中编译好,形成各种rmp软件包挂在服务器上,来让使用者根据自己的环境来选择对应的软件包,用yum进行安装。
所以我的Linux机器内部,一定内置了目标服务器的下载链接!
3例子
普通用户下载前面要加sudo进行指令提权。
但有可能sudo失败,因为root用户不信任你,没有把你加到白名单里
解决:在root账号下添加用户到白名单:
vim /etc/sudoers
找到上面的位置在root的下面添加用户名字(复制root行粘贴到下一行并把root改为用户名)
3.1查看软件包
(sudo)yum list | grep xxx
3.2下载软件包
(sudo)yum install xxx
3.3卸载软件包
(sudo)yum remove xxx
4本地配置
本地配置是干什么的?
yum会根据 /etc/yum.repos.d/该目录下面的配置文件,来构成自己的下载链接。
一般云服务器在本地配置方面就帮我们配置好了。但如果是自己电脑的虚拟机,内置的链接一般是Centos的官网(国外的),下载的速度很不稳定。
为了解决问题或者是企业的需要,他们就会把进行各种处理,形成Centos的镜像:
但要怎么做呢?简单来说:就是更改上面目录下的文件内容(内置链接的更换)
操作:(root用户下进行)
cd /etc/yum.repos.d
我们需要配置的是CentOS-Base.repo和epel.repo文件
先下载wget,先备份就不能用yum安装东西了
yum install wget -y
备份原来的文件(给文件重命名了)
mv CentOS-Base.repo CentOS-Base.repo.bak
下载新的CentOS-Base.repo文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all 清除缓存
yum makecache 生成新的缓存
接下来下载epel库
yum install -y epel-release
出现这两个文件就下载成功了!!!
再次运行yum clean all 清除缓存,运行 yum makecache 生成新的缓存就完成相关的配置了!
5.本地与Linux文件互传
yum install -y rzsz
二vim
vim是一款多模式的编译器,我们日常在linux上写代码就要进行对vim的配置,使它的功能与VS上大致相同。
1模式
vim有三种模式:命令模式,插入模式,底行模式。
用vim打开文件时,首先进入的是命令模式,然后再根据需求来按下对应的按键。
2命令模式
允许使用者通过命令来进行文本的编辑控制
n+yy 复制当前的n行 n:连续复制的行数
n+p 粘贴,当前光标的下一行 n:把内容粘贴n次
u 撤销 ctrl+r:对历史的撤销进行撤销
n+dd 剪切/删除指定行 n:连续的多行
shift+6 将光标定位到当前行的开始
shift+4 将光标定位到当前行的结尾
gg 将光标定位到整个文本的最开头
shift+g 将光标定位到整个文本的末尾
n+shift+g 将光标定位到整个文本的n行
h 左 j(jump) 下 k(king) 上 l右
b 按单词为单位进行光标前移
w 按单词为单位进行光标后移
shift+` 大小写快速切换
n+x 删除光标后续的n个字符
n+f 对光标指定的位置,进行n个字符的替换
shift+r 进入文本替换
shif+zz 保存并退出
3底行模式
用来进行让vim进行包括但不限于shell进行交互(在这个模式能用shell中的命令进行使用)
w 保存
q 退出
! 强制
set nu 打开行号
nonu 去掉行号
/xxx 搜索xxx
!command 不退出vim,可以进行shell命令
:vs filename 分屏,多文件操作
4插入模式
进行文件的写入
常见的批量化注释与去注释:
ctrl+v hjkl区域选择,j,shift+i,//,Esc*2
ctrl+v hjkl区域选择,包含且仅包含//,d
5vim配置
vim不仅仅只会对文本进行修改,它也会读取文件.vimrc。所以在家目录下创建该文件然后在里面进行配置。
5.1一键式配置
(建议普通用户下进行)输入指令:
yum install -y curl
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
三gcc&&g++
1gcc与g++
gcc在Linux中默认是低版本的,在使用时最后要带上:-std=c99
gcc 源文件名 -o 可执行程序名 -std=c99
g++编译器在Linux中默认是没有的需要自己yum
yum install -y gcc-c++
g++ 源文件名 -o 可执行程序名 -std=c11
2程序的翻译过程
一个程序的从编译到完成,要经历以下几个阶段:预处理,编译,汇编,链接。最后生成可执行程序。
2.1预处理
主要实现的是:宏替换,去注释,头文件展开,条件编译
gcc -E test.c -o test.i
在一个软件中分别有不同的版本:有社区版与企业版。那么在维护这个软件的源代码是否需要有两份源代码来维护呢?
没必要;因为在预处理中程序会进行条件编译,来实现不同的功能:
#include<stdio.h>
2 int main()
3 {
4 #ifdef v1
5 printf("function 1\n");
6 #elif v2
7 printf("function 1\n");
8 printf("function 2\n");
9 #else
10 printf("function 1\n");
11 printf("function 2\n");
12 printf("function 3\n");
13 #endif
14 return 0;
15 }
gcc -D(定义宏)v1=1 xxx
2.2编译
从现在开始进行程序的编译,将C语言变成汇编语言。
gcc -S test.i -o test.s
2.3汇编
从现在开始进行程序的翻译,汇编完成生成对应的二进制目标文件。
gcc -c test.s -o test.o
关于编译与汇编,为什么我们不直接将c语言直接翻译成二进制目标文件呢?
这就涉及到在早期时还没有C语言的时候,在写程序时程序员都要一个一个去查对应的二进制的数,非常不方便对程序进行维护。后来有人就有发明了一套汇编语言出来,再用二进制写了汇编编译器,大大减少维护代码的时间。在后来用汇编语言,写了一个新的汇编编译器,以后的汇编代码就通过它来实现程序的运行。
一个新语言的出现伴随着编译它的新的编译器(用新语言写的)的出现,这便是编译器的自举过程!
2.4链接
将二进制目标文件形成可执行文件
gcc test.o -o test.exe
a二进制目标文件究竟被编译器拿去干什么了?
我们的程序会去和(C语言)库结合。
在我们每个语言中,一定要有自己对应的标准库
在我们下载VS,VS下载完后进入界面会让你选择对应的开发环境并进行安装
这里的安装其实是在:安装C标准库和C对应的头文件!
b为什么要进行链接,不要链接行不行?
让开发站在巨人的肩膀上,提高开发效率
也可以,但相对应的函数与功能都要自己去实现,没必要!
c链接会怎么做
链接时,通常会有两种方式:动态链接与静态链接,也就会有动态库与静态库
Linux中,动态库:.so 静态库:.a
window中,动态库:. dll 静态库:.lib
关于动静态库,在这里有一个小故事来理解它们:
在你的努力下,你以很不错的成绩考上XX中学,但是学校里面不允许学生带手机来上学,而且还要强制在宿舍里面住,这让你感到不适:因为在学校有上网的需求。于是你向四处到处打听,认识了一个高三的学长:他告诉你:在学校的东门往北走200米有家小蚂蚁网吧可以去那里上网。你听完很高兴,开始规划起在学校的周末计划:上午写完两篇作文,中午吃完饭后去网吧里上一小时网,下午回来时在接着写数学大题。在这天星期六中午吃完饭后,你很开心按学长的告诉的路线踏上上网的道路。随着对网吧的环境越来越熟悉,去到网吧跟老板点头他就知道你是要来这上网。一切在按照自己的计划进行着...
突然有一天,小蚂蚁网吧被因为被人举报被派出所查封了。你在家听到这个消息以后就闷闷不乐:以后上网就没地方去了,这该怎么办呢?你爸爸看到你这样就来询问原因,得知你是因为找不到上网的地方不能去查学校资料了。你爸就给校长打了个电话解决了问题:在你自己的宿舍安装了一台电脑(网吧查封后老板卖的电脑)你心想:这会终于能上网上个够了!
在这个故事里:学长相当于编译器,告诉了你目标库的地址(动态链接)
小蚂蚁网吧相当于动态库
XX中学是对应的内存,你的计划当中的去上网的这一步=该行代码要调用到动态库(方法)
而你在宿舍安装的(网吧)电脑=从动态库中需要调用的方法拷贝到静态库中方便下次如果是一样的流程就不用再去调用动态库,提到效率!
既然有两种链接方式,那就各有优缺点:
动态库优点:节省资源 缺点:不能丢失
静态库缺点:一旦形成与动态库无关 缺点:浪费资源
在Linux里,动态库是默认有的,而静态库是默认没有安装的,需要自己去安装:
四make&&makefile
1背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令。
2原理
首先来见见最简单的makefile:
(默认形成第一个目标文件)mytest(目标文件):test.c(依赖文件列表)可以是多个用空格分开
(tab键)这里的gcc指令是test.c的依赖方法,test.c在这里叫做依赖关系
.PHONY:xxx 用到xxx的方法总是要被执行的
有了makefile文件,make会根据makefile的内容来进行编译/清理工作
这里的依赖关系与依赖方法用故事来理解它们:
在大学生活里如果没钱了通常要向父母要钱,你打电话过去要钱通常是会给的(排除特殊原因),{这里的你与父母的关系就是所谓的依赖关系,打电话要钱即是这个过程的依赖方法。}没有依赖关系,你去向你舍友的父母要钱你看他会不会给你!!
3现象
a make对象对最新的可执行程序,为什么默认不更新?
b怎么做到的?
makefile对可执行文件判断要不要进行编译
看的是文件最近的修改时间与生成的可执行程序的修改时间,最近的修改时间晚就编译它
否则就不编译,这是为了提高编译效率,减少不必要的时间!
如果不要修改到文件内容并且要使它多次编译成功,怎么做?
1在第一行写.PHONY:gcc
2用touch来修改时间
4其它写法
定义两个变量来代替目标文件与依赖文件方便修改文件名
shift+4@ =目标文件 shift+4^=依赖文件
命令前加@表示在make执行时不显示对应的指令,使用make更简洁一点
这种写就把代码要编译的过程生成的对应文件给写出来
关于顺序问题:最终要形成的目标文件(链接)一定要在第一行,保证Linux找到它形成目标文件,其它的乱不乱无所谓。(压栈操作)
五缓冲区
5.1回车与换行
在我们写代码时,printf("hello warld\n");在打印消息完后总要带上\n进行打印完消息后的换行
但\n是经过特殊处理的,执行\n有两个动作:回车和换行。(\r\n)
在Linux中,在写完指令后进行按键的回车,有两个动作:光标要先回到最左侧再进行换行,
才是我们所认为的”换行“,只是Linux要执行这两步才能达到
2缓冲区
1 #include<stdio.h>
2 #include<unistd.h>
3 int main()
4 {
5 printf("hello Linux");
6 sleep(3);
7 return 0;
8 }
在执行上面的代码时,我们发现:在刚开始光标在最左侧不动,过来三秒才打印出消息,为什么?在我sleep区间,打印的内容去了哪里?
其实这个内容拷贝到缓冲区中,当程序结束时,强制刷新缓冲区到显示器上才让我们看到。
关于缓冲区刷新,有以下情景是会自动冲刷缓冲区:
1遇到\n 2缓冲区满了 3对应的函数进行缓冲区的强制刷新
六进度条
有了以上的知识点,现在我们来做Linux第一个小程序——进度条
6.1版本a
1要实现一个进度条出来,我们要有:字符数组中存储空格和当前进度。在数组中不断地进行元素的添加,知道把数组的空格都代替为止。
要注意:如果要实现出来的进度条是呈现出动态增长的效果,每次展现完数组的元素后加上\r"回车",使光标回到最左边
2在循环结束后,即进度条已经到100%了,进行\n的打印,让结果打印到显示器上
#define lenth 101
#define style 'x'
const char*str="/-|\\";
void probar()
{
char arr[lenth];
memset(arr,'\0',lenth);
int num=0;
int len=strlen(str);
while(num<=100)
{
printf("[%-100s][%3d%%][%c]\r",arr,num,str[num%len]);
fflush(stdout);
arr[num++]=style;
usleep(20000);
}
printf("\n");
}
6.2版本b
版本a的实现没有一点毛病,但在实际中是要结合对应的场景进行结合的,如:在下载资源的界面
有:下载资源的大小与对应的网速
在版本a的基础上加上对资源相关计算出当前的进度并展现到数组中:
#include <stdio.h>
#include <string.h>
#include <unistd.h>//Linux中sleep的头文件
typedef void(*callback_t)(double,double);//函数指针
double bandwidth=1024*1024*1.0;
#include "Processbar.h"
#define lenth 101
#define style 'x'
const char*str="/-|\\";
void probar1(double filesize,double current)
{
char arr[lenth];
memset(arr,'\0',lenth);
int num=0;
int len=strlen(str);
double rate=(current*100.0)/filesize;
int loop_count=(int)rate;
while(num<=loop_count)
{
arr[num++]= style;
}
printf("\033[35m[%-100s]\033[0m[%.1lf%%][%c]\r",arr,rate,str[num%len]);//\033[35m与\033[0m对应出来的字符颜色不同
fflush(stdout);
}
void download(double filesize,callback_t cb)
{
double current=0.0;
printf("the file is downloading:...\n");
while(current<=filesize)
{
cb(filesize,current);
usleep(200000);
current+=bandwidth;
}
printf("\nthe file is fished:%lf\n",filesize);
}
int main()
{
download(1024*1024*50,probar1);
download(1024*1024*30,probar1);
download(1024*1024*70,probar1);
return 0;
}
七gdb
Linux中如果要进行相关代码的调试,就要要到gdb来进行调试,gdb在Linux中是默认安装的
在VS中我们在编写代码的环境有两种:debug模式与release模式,debug模式才支持我们进行对应的调试。
但在Linux种编译,默认形成的可执行文件是release模式的,要先形成debug模式,在编译时要加上-g选项进行编译。那默认形成的真的是release吗?
7.1gdb基础指令
q/quit 退出gdb
l/list (文件名)行号/函数名 打印对应的内容
b (文件名)行号/函数名 在对应位置打断点
i/info b 查看当前总断点信息
d/delete 断点编号(用i b查询) 删除断点
disable/enable 断点编号 使能(关闭,打开)断点
r/run 到指定的断点后停止(没有断点,进行整个程序的编译)
n/next 逐过程=F10
s/step 逐语句=F11
p/print 变量或地址 查看变量内容或地址
display 变量或地址 将变量或地址在每次调试时打印在屏幕上=监视窗口
undisplay 变量或地址 取消变量或地址每次在屏幕上的打印
continue 执行到下个断点处
finsh 运行结束所在函数就停下来
until 跳转到指定行(中间的代码是运行的!)=拖拉箭头
set var 设置变量 在当前循环中修改变量的值(检查是否越界)
info locals 查看当前栈帧局部变量的值
最后
以上便是Linux中关于关于环境与工具的介绍,希望对你有所帮助