【Linux】三、Linux 环境基础及开发工具使用(下篇)

简介: 目录六、Linux 软件包管理器 yum6.1 前言6.2 什么是软件包6.3 查看软件包6.4 如何安装软件6.5 如何卸载软件6.6 yum 源6.7 一些好玩的命令七、Linux第一个小程序-进度条 7.1 \r&&\n 7.2 行缓冲区概念7.3 进度条代码八、Linux 使用 git 命令行 8.1 版本控制8.2 git 的历史8.3 git 安装8.4 克隆远程仓库到本地8.5 git 三板斧8.51 三板斧第一招: git add8.52 三板斧第二招: git commit8.53 三板斧第三招: g

目录

六、Linux 软件包管理器 yum

6.1 前言

6.2 什么是软件包

6.3 查看软件包

6.4 如何安装软件

6.5 如何卸载软件

6.6 yum 源

6.7 一些好玩的命令

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

7.1 \r&&\n

7.2 行缓冲区概念

7.3 进度条代码

八、Linux 使用 git 命令行

8.1 版本控制

8.2 git 的历史

8.3 git 安装

8.4 克隆远程仓库到本地

8.5 git 三板斧

8.51 三板斧第一招: git add

8.52 三板斧第二招: git commit

8.53 三板斧第三招: git push

九、Linux调试器 - gdb使用

9.1 背景

9.2 gdb 开始使用

9.3 gdb 调试例子


六、Linux 软件包管理器 yum

6.1 前言

思考:

你要下载的软件之前是存在你电脑或手机上的吗?

  • 答案:不是

如果不在,你怎么知道你要下载的软件在哪里?

  • 答案是通过浏览器搜素或应用商店下载的

那浏览器或应用商店上的软件是谁放的呢?

  • 答案是它的内部人员或软件提供者放的,它们都统一放在服务器上,你要下载就通过访问服务器来下载里面的软件

同理,Linux上安装软件也是如此,Linux 上下载软件一般是通过 yum 来下载的,它就类似于应用商店一样。

-------------------我是分割线------------------  

6.2 什么是软件包

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

6.3 查看软件包

yum list

通过 yum list 命令可以罗列出当前一共有哪些软件包,全部显示

image.png

由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.

yum list | grep [需要查找的软件包名]

例如:yum list | grep lrzsz

image.png

注意事项:

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

6.4 如何安装软件

通过 yum, 我们可以通过很简单的一条命令完成一些软件的安装,比如我们要安装 lrzse,普通用户安装需要 sudo

1. sudo yum install [软件包名]
2. //假设安装 lrzsz
3. sudo yum install lrzsz

敲下这条指令即可安装lrzse,yum 会自动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装,当出现 "complete" 字样, 说明安装完成。

也可以这样

sudo yum install -y lrzsz

-y 表示有关于这次安装的问题不用请求我的同意,出现 “complete" 字样,说明安装完成

image.png

注意

  • 安装软件时由于需要向系统目录中写入内容,一般需要 sudo 或者切换到 root 帐户下才能完成
  • yum 安装软件只能一个装完了再装另一个,正在 yum 安装一个软件的过程中,如果再尝试 um 安装另一个软件,yum 会报错
  • 如果 yum 报错, 请自行百度

6.5 如何卸载软件

仍然是一条命令,普通用户也是需要sudo

1. sudo yum remove [软件名]
2. sudo yum remove -y [软件名]
3. //比如卸载 lrzsz
4. sudo yum remove lrzsz

image.png

出现 “complete" 字样,说明卸载完成

image.png

6.6 yum 源

yum 源就是一个配套文件,说白了就是一堆链接,提供下载途径

查看自己的 yum 源:

ls /etc/yum.repos.d

image.png

随便打开一个 yum源

vim /etc/yum.repos.d/CentOS-Base.repo

我们会发现里面全是链接,这些链接就是供我们下载软件用的,一般 yum源只有几个,需要自己添加yum源

image.png

  • 一般原生的Linux 系统,内置的下载链接基本都是配套国外的网址。一些提供服务器的公司,华为腾讯之类的,他们给我们提供云服务的时候,基本上已经把 yum 源换成国内的了。
  • 由于国内的防火墙,很多国外的网站已经访问不了了,像腾讯这些大公司就会把国外整个网站里面的东西全部复制过来,把Linux 里面是国外的 yum 源全部替换成国内自己的。

安装 yum扩展源,提供一些非官方的软件

sudo yum install -y epel-release

这个我之前就安装有了

image.png

  • 如果自己的yum源是国外的,需要自己更新一些yum源,安装替换新的yum源建议自己备份一下原有的yum,再进行覆盖旧的yum源
  • 这里就不演示了,(因为我自己的是国内哈哈hh),自己百度一下即可。

6.7 一些好玩的命令

sudo yum install -y sl

安装好这个后,输入 sl ,就可以看到小火车跑了

67cb0a2f100340949f8824f477f2b856.gif

其他好玩的插件,自己百度搜索即可,最好带上自己的 Linux版本

-------------------我是分割线------------------  

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

7.1 \r&&\n

\n 我们都懂,\n不就是回车换行吗,可是真的是你理解的那样吗,事实上并不是你理解的那样,回车和换行压根就不是一个概念

如图:

image.png

\r 则是换行,\n是回车换行

看一下老式键盘,回车换行的原来的图形是那样子的,而不是现在这样子的

image.png

7.2 行缓冲区概念

这段代码运行时的现象是什么?

#include<stdio.h>#include<unistd.h>                                                                                        intmain()
{
printf("hello world\n");
sleep(2);
return0;
}

运行结果如下:

2b7b1b8eb3a2445192d1017f1a350d0c.gif

那下面这段代码呢?(去掉了\n)

#include<stdio.h>#include<unistd.h>                                                                                        intmain()
{
printf("hello world");
sleep(2);
return0;
}

运行结果如下:

2b7b1b8eb3a2445192d1017f1a350d0c.gif

第一个程序我们可以理解,先 printf 后 sleep ,可是第二个呢?为什么先执行的是 sleep 后 printf ?

其实这里执行 sleep 时,printf 已经执行了,也就是说,printf 已经执行了,并不代表信息会被我们看到,这又是为什么呢?

  • 这也是之前我们学过的一个概念 —— 缓冲区(在学 C语言文件操作的时候已经接触过了),对于这个概念,我们对它的理解都是浅薄,真正要理解缓冲区,大概会在 Linux系统编程部分,学习基础 IO 后,才会真正理解缓冲区。
  • 在此之前我们可以理解为,缓冲区本质上是一段内存空间,它可以暂存临时数据,在合适的时候刷新出去。
  • 而 \n 的作用就是把 \n 之前的字符全部刷新出去,也就是显示到显示器上。

再看这个代码:

#include<stdio.h>#include<unistd.h>                                                                                        intmain()
{
printf("hello world");
fflush(stdout);
sleep(2);
return0;
}

运行结果:

2b7b1b8eb3a2445192d1017f1a350d0c.gif

最后再解释下这里的现象,这里是往显示器上显示,默认的刷新方案是行刷新,而如上并没有 \n,所以不会刷新,只能把缓冲区写满或程序结束才能刷新,所以为了让它显示出来,需要强制刷新 fflush(stdout),这个可以帮助我们写进度条小程序

-------------------我是分割线------------------  

7.3 进度条代码

先来看一个倒计时代码

原理:回车不换行,依次覆盖,使用 \r,需要注意的是没使用 \n,不能刷新,所以需要 ffush 强制刷新

#include<stdio.h>    #include<unistd.h>    intmain()    
{    
intcnt=5;    
while(cnt>=0)    
  {    
printf("倒计时:%d\r", cnt);    
cnt--;    
fflush(stdout);    
sleep(1);                                                                                                 
  }    
return0;    
}    

运行结果:

2b7b1b8eb3a2445192d1017f1a350d0c.gif

这里有个问题,比如十位数是两个数,当减到个位数它只会覆盖一个数,留下了10 的另一半 0,解决方法就是加上位宽来控制

#include<stdio.h>    #include<unistd.h>    intmain()    
{    
intcnt=5;    
while(cnt>=0)    
  {    
printf("倒计时:%d\2r", cnt);    
cnt--;    
fflush(stdout);    
sleep(1);                                                                                                 
  }    
return0;    
}    

进度条代码:

usleep 单位是微秒,sleep 单位是秒

#include<stdio.h>    #include<unistd.h>    #include<string.h>    #define NUM 102    intmain()    
{    
charbar[NUM];    
memset(bar, 0, sizeof(bar));    
constchar*lable="|/-\\";    
intcnt=0;    
while(cnt<=100)    
  {    
printf("[%-100s][%d] %c\r", bar, cnt, lable[cnt%4]);    
bar[cnt++] ='#';    
fflush(stdout);    
usleep(20000);    
  }    
printf("\n");                                                                                               
return0;    
}    

运行结果:

2b7b1b8eb3a2445192d1017f1a350d0c.gif

有兴趣的话,可以给进度条更好的优化

-------------------我是分割线------------------  

八、Linux 使用 git 命令行

8.1 版本控制

       版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。

用故事解释:

  • 小明用 word 写实验报告,其小明写完了实验报告把第一个版本上传给老师,老师说不合格随后又给小明打回来,让小明修改,小明修改完后又上传给老师,重复修改了n次后老师说,还没第一版写的好,算了,小明你把第一个版本给我吧!对此,小明心里极度不爽,因为小明的第一版本修改来修改去已经不见了。
  • 张三看到小明惨痛的经历,于是张三第一个版本写完,交给老师,被打回来后,张三留了个心眼:万一自己改完,老师又要我老的版本呢,所以张三对第一个版本进行了备份,然后进行修改生成第二个版本,随后上传第二个版本,又被打回来了,然后张三又留了个心眼,万一老师要我的第二个版本呢,随后又对第二版进行备份,然后进行修改生成第三个版本,随后上传第三个版本,老师说:算了张三你拿第二个版再修改一下就交给吧。张三继续备份第三个版本,张三拿出第二个版复制并对其修改,生成了2.1版本,提交后老师说:你改的啥啊,算了张三你直接那第一个版本给我吧,不用改了。此时张三心中庆幸:还好我都保存有。
  • 其中张三所做的这个工作可以叫做版本管理。不过,张三所做的所有工作都是手动做的,成本较高。张三想了想,学校很多同学遇到这个老师都会遇到这种情况,张三直接叫人写了一个app,专门用于储存旧版本,每修改一次就自动保存就版本,想要哪个版本就拿哪个版本。
  • 这个app 的作用就相当于 git,基于 git 搭建的一些网站叫 github 或 gitee,张三对各个版本的保存和拿出就叫版本控制。

-------------------我是分割线------------------  

8.2 git 的历史

      Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。


       事实上,在 2002 年以前,世界各地的志愿者把源代码文件通过邮件的方式发给作者,然后由作者本人通过手工方式合并代码,随着代码量的增多,成本也越来越高了,所以 Linus Torvalds 就在市面上找了很多版本管理的工具,当时市面上比较成熟的工具都是需要付费的,倒也不是人家掏不起钱,主要是和 Linux 的开源精神不符,其实当时 Linus Torvalds 选择了一个商业的版本控制系统 BitKeeper,因为这个公司的老板比较敬佩 Linus Torvalds ,直接免费给 LInux 社区提供服务。但是 Linux 社区中存在很多的大佬,进行破解研究 BitKeeper !人家老板当然不干了:我免费给你用,你却想砸我的饭碗。


       到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。(2周左右!) 也就是后来的 Git!

  • github 由于国内的防火墙的原因,现在访问速度极慢,给人体验极其不好,所以目前推荐用国内的 gitee,gitee 就相当于 github 的中文版。

-------------------我是分割线------------------  

8.3 git 安装

gitee 链接:点这,进去创建账号并创建好仓库。

不懂的看着,gitee教程:gitee(码云)的注册和代码提交【手把手】

sudo yum install git

image.png

8.4 克隆远程仓库到本地

git clone [url]

这里的 url 就是刚刚建立好的 仓库项目 的链接,等待同步完成即可,不是开源的要输入自己的账号和密码

image.png

-------------------我是分割线------------------  

8.5 git 三板斧

8.51 三板斧第一招: git add

git add [文件或目录名]:将当前文件或目录下的所有文件添加到本地仓库

git add 必须在本地仓库下进行,否则无法进行 add,ps:

image.png

可以拷贝或移动文件到本地仓库目录下,再或者文件直接在仓库内创建

image.png

到仓库目录下再 add,[git add .]是 add 当前目录下所有文件

image.png

8.52 三板斧第二招: git commit

git commit -m “提交日志说明”

提交代码到本地仓库中,注意引号里的东西不要胡写,提交的时候应该注明提交日志, 描述改动的详细内容。因为 git log 就可以查看到你所有的提交信息。

第一次提交可能会让你完善信息,按照提升操作即可

image.png

按照提示添加:

image.png

再次 git commit

image.png

注意这里的提交并不是把内容上传至远端,而是把内容提交到你的本地仓库,远端仓库并没有进行同步

image.png

-------------------我是分割线------------------  

8.53 三板斧第三招: git push

提交代码到远端仓库

git push

提交如下:

image.png

按照提示输入账号和密码即可,等待提交成功即可

image.png

再去 gitee 上看,已经同步到远端仓库了

image.png

注:

  • 有时候会出现无法提交,直接无脑 git pull
  • .gitignore //不想提交某些后缀的文件同步到 git 远端仓库,把需要添加的后缀添加到 .gitignore 文件里。

-------------------我是分割线------------------

九、Linux调试器 - gdb使用

9.1 背景

  • 程序的发布方式有两种,debug模式和release模式(C语言已经学习过了,这里就不解释了)
  • Linux gcc/g++出来的二进制程序,默认是release模式,要在 debug 版本下调试
  • 程序出错肯定是要调试的,毕竟做项目代码量太大,肉眼看就是受罪
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

测试使用代码:

 #include<stdio.h>    
  int AddTop(int top)    
  {    
    int ret = 0;
    int i = 0;
    for(i = 0; i <= top; i++)    
    {    
      ret += i;    
    }  
    return ret;   
}    
  int main()    
  {    
    int top = 100;    
    int result = AddTop(top);    
    printf("%d\n", result);                                                                                   
    return 0;    
  }    

debug 和 release 大小比较,debug 比 release 所用空间大就是插入了调试信息,可用于调试

image.png

9.2 gdb 开始使用

gdb [binFile]

gdb 退出: ctrl + d 或 quit

调试命令:

(每个命令基本都可简写,建议使用简写)

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r 或 run:运行程序,没有断点程序直接运行结束。
  • n 或 next:单条执行。
  • s 或 step:进入函数调用
  • break / b 行号:在某一行设置断点
  • break [函数名]:在某个函数开头设置断点
  • nfo b/ break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print / p:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p [变量]:打印变量值。
  • set var:修改变量的值
  • continue 或 c:从当前位置开始连续而非单步执行程序,运行至下一个断点
  • delete breakpoints:删除所有断点
  • d n  / delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

9.3 gdb 调试例子

测试代码依旧是上面的,release 版本无法调试

image.png

使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

gcc test.c -o mytest -g

可以进行调试

image.png

list/l [行号]:显示binFile源代码,接着上次的位置往下列,每次列10行

image.png

r 或 run:运行程序,没有断点程序直接运行结束

image.png

接下来全用简写,写完太麻烦了

break / b 行号:在某一行设置断点

image.png

info break/b :查看断点信息

image.png

d n  / delete breakpoints n:删除序号为n的断点,序号为 num 的一列

image.pngdisable breakpoints/ n:禁用断点,enable breakpoints/ n:启用断点

image.png

image.png

演示到这,后面不演示了...


这两篇文章仅仅是对这些开发工具作一个了解,还需要自己投入大量时间进行练习使用这些工具,这些工具的知识扩展还得靠自己一步一个脚印,毕竟学习的道路漫长且艰,文章到这就结束了。


-------------------我是分割线------------------    

文章就到这里,下篇即将更新

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
15天前
|
Ubuntu Linux Shell
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
(已成功解决)Linux环境报错—bash: wget: command not found;常见Linux发行版本,Linux中yum、rpm、apt-get、wget的区别;Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
181 68
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
|
11天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
2月前
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
46 4
|
3月前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
570 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
2月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
137 3
|
2月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
59 3
|
2月前
|
Linux UED iOS开发
|
NoSQL Linux 开发工具
Linux开发工具的使用
1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.
1348 0
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
138 8
|
2月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
548 6