Linux工具篇

文章目录

  • 1.yum
    • 1.1 yum是什么?
    • 1.2yum下载的软件包在哪?
    • 1.3 yum的配置
    • 1.4 yum的相关操作
  • 2. Vim
    • 2.1 各种模式的相关操作
    • 2.2 利用vim解决普通用户无法sudo的问题
    • 2.3 vim的配置
  • 3.gcc/g++
    • 3.1 利用gcc理解程序的翻译过程
    • 3.2 编译器的自举
  • 4. 程序的链接
    • 4.1动态链接
    • 4.2静态链接
  • 5. make/makefile
    • 5.1makefile的编写
    • 5.2makefile的原理
  • 6.Linux工具的综合使用
    • 6.1 倒计时小程序
      • 6.1.1 缓冲区
      • 6.1.2 代码实现
  • 7. git和github
    • 7.1 git是什么
    • 7.2 git的起源
    • 7.3 git的操作
  • 8.gdb
    • 8.1 release和debug的区别
    • 8.2 gdb的操作

1.yum

1.1 yum是什么?

简单点讲,yum类似于我们手机上的应用商店;刚买的手机想要下载软件,一般都是从应用商店下载;同样的,在Linux想要下载东西,最常见的方式就是借助yum进行下载安装;同时,我们下载的软件可能需要依赖其他软件才能正常使用,yum在下载这类软件时会帮助我们解决这些问题

1.2yum下载的软件包在哪?

我们在手机上要下载的软件包是不是原本就在手机上?答案是否定的,在Linux中也是如此,想要下载的软件包在机器的远程服务器上,yum通过本地的yum源找到远程服务器,再在服务器中找到对应的软件包,下载到本地机器,再安装下来在这里插入图片描述

Linux中,yum源通常有两种:

  1. base源(基本软件源):这里面的软件基本是稳定的
  2. epel源:扩展软件源,这里面的软件的稳定性是不确定的

两种源的路径保存在Linux中的【/etc/yum.repos.d】路径下在这里插入图片描述

这两个配置文件中存储着下载链接,当使用yum下载软件时,会根据配置文件中的下载链接找到对应的下载地址,再进行软件下载;

但配置文件中的下载链接通常是在国外的,有时下载速度慢,这就需要我们修改yum的配置文件;其本质是更改软件下载链接

1.3 yum的配置

  1. 进入到本地yum仓库中

    cd /etc/yum.repos.d
    
  2. 备份本地yum源

    mv CentOS-Base.repo CentOS-Base.repo.bak
    
  3. 下载阿里yum源

    wget http://mirrors.aliyun.com/repo/Centos-7.repo
    
  4. 将阿里yum源改名为Linux系统默认读取的yum源

    mv Centos-7.repo CentOS-Base.repo
    
  5. 加载阿里yun源

    yum clean allyum makecacheyum update
    

1.4 yum的相关操作

yum的基本操作有三种

  1. 下载并安装**【yum [-y] install xxx】**
  2. 卸载**【yum [-y] remove xxx】**
  3. 查找**【yum list | grep xxx】**

2. Vim


vim是一款多模式的文本编辑器,经常使用的有三种模式:

  1. 命令模式
  2. 插入模式
  3. 底行模式

在这里插入图片描述

2.1 各种模式的相关操作

  • 插入模式:用来正常的编写代码

  • 命令模式:通过命令进行文本的编辑

    n+yy        #复制光标所在的行,n表示复制下面的n行
    n+p         #粘贴,n表示粘贴n次
    u           #撤销
    ctrl+r      #对撤销进行撤销
    n+dd        #剪切光标所在行,n表示剪切下面的n行
    shift+4     #将光标定位到当前行的结尾
    shift+6     #将光标定位到当前行的开头
    gg          #将光标定位到整个文本的开头
    shift+g     #将光标定位到整个文本的结尾
    n+shift+g   #将光标定位到第n行
    h,j,k,l     #左,下,上,由
    w           #以单词为单位进行光标后移
    b           #以单词为单位进行光标前移
    shift+`     #大小写快速转换
    n+x         #删除光标后的n个字符
    n+shift+x   #删除光标前的n个字符
    n+r         #对光标所在字符进行替换,可以n个字符替换
    shift+r     #进入替换模式
    shift+zz    #保存并退出
    
  • 底行模式:可以实现vim与shell交互

    w               #保存
    q               #退出
    wq              #保存并退出
    !               #强制
    set nu/nonu     #显示行号
    !command        #不退出vim执行Linux命令
    vs filename     #分屏
    /xxx            #搜索
    ctrl+w          #分屏中切换屏幕
    

再额外介绍几个操作

v             						   #进入视图模式
v+hjkl+d      						   #批量截切
v+hjkl+y      						   #批量复制
ctrl+v        						   #进入块视图模式
[ctrl+v]+[hjkl]+[shift+i]+[//]+[esc]     #批量注释
[ctrl+v]+[hjkl]+d                        #批量去注释

2.2 利用vim解决普通用户无法sudo的问题

我是一名普通用户,在某些特殊情况需要指令提权才能执行相关操作;在Linux中允许我们这样做,但前提是该普通用户在root的sudoers列表当中,学会了vim的基本操作,我们就可以添加用户到sudoer是列表中了

  1. 使用vim打开sudoers文件,必须是root用户,因为普通用户对sudoers文件没有任何权限
vim /etc/sudoers
  1. 在文本的100左右按照root的格式添加要加入的用户在这里插入图片描述
  1. shift+:加入底行模式,wq!强制保存退出

2.3 vim的配置

在执行vim命令时,不光是执行vim这样一个可执行文件,还会去用户的家目录执行一个名为.vimrc的文件;配置vim的本质就是在.vimrc文件中添加想要的功能指令

.vimrc是在每个用户的家目录当中的,因此不同的用户,可以自己配置属于自己的vim

vim的一键配置:

普通用户下,确保你的Linux系统是Centos7.6的,执行【curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh】命令,即可一键配置vim

想要删除配置好的vim,在安装了VimForCpp的用户下执行【bash ~/.VimForCpp/uninstall.sh】命令即可

3.gcc/g++


gcc是一款用来编译以.c结尾的C语言文件的编译器;而g++是一款用来编译以.cpp/.c/.cxx结尾的c++文件的编译器

一般Linux系统中,gcc是系统默认就有的,只不过版本可能较低;g++需要我们自行安装

sudo yum -y install gcc-c++        #Linux中安装g++

3.1 利用gcc理解程序的翻译过程

我们知道,一个源代码文件需要经过编译和链接才能变成一个可执行程序,而编译又分为预编译,编译和汇编三步骤;知道了gcc,我们就可以验证三个步骤分别做了什么了在这里插入图片描述

3.2 编译器的自举

最早期,机器只能识别二进制指令,科学家们觉得二进制不方便,于是使用了助记符来表示二进制;助记符的形式慢慢发展,变成了汇编语言;科学家是知道汇编代码代表的二进制指令,但由于没有汇编代码的编译器,机器是不认识汇编代码的,这样就必须有能将汇编代码转换成二进制代码的编译器才行;于是科学家用二进制代码写了一个编译器,能成功编译汇编代码,但由于还是使用的二进制代码,不够方便;此时有个问题,编译器是个软件,既然是个软件,就代表着能用代码进行编写,那能不能用汇编代码来编写一个编译器,用来翻译汇编代码呢?答案是可以的,因此科学家们就实现了这样的编译器,完成了编译器的进步;

向上面这种,编译器随着语言的进步而进步,叫做编译器自举的过程

为什么一个程序的翻译过程是预处理—>编译—>汇编—>链接呢?

在编译器自举的过程中讲到,二进制语言先发展成为汇编语言,再发展成为高级语言;由于机器只能看懂二进制语言,因此我们需要将高级语言翻译成二进制语言;此时有两种方案:

  1. 直接编写能将高级语言翻译成二进制语言的编译器
  2. 只需编写能将高级语言翻译成汇编语言的编译器即可,因为汇编语言翻译成二进制语言的技术已经有了

毫无疑问,肯定是选择第二种,这样不仅能降低编译器的开发难度,更是利用了前人留下的成果;因此,如今一个程序被翻译成二进制目标文件的过程是预处理—>编译—>汇编—>链接

4. 程序的链接


源代码经过预处理—>编译—>汇编形成的二进制目标文件需要经过链接才能被执行;链接的过程其实就是目标文件和库结合的过程;源代码中库函数的具体实现是在C标准库中,在Linux中,使用【ldd】命令可以查看一个可执行程序所需要的标准库在这里插入图片描述

源代码中,我们包含需要库函数的头文件,在链接时,编译器就会去标准库中将源代码与头文件对应的源文件链接

链接方式有两种:

  1. 动态链接
  2. 静态链接

与动态链接对应的是动态库,与静态链接对应的是静态库;

在Linux和Windows中,动态库和静态库的文件后缀不同

Linux中:

  • 动态库:xxx.so
  • 静态库:xxx.a

Windows中:

  • 动态库:xxx.dll
  • 静态库:xxx.lib

4.1动态链接

gcc链接时默认采用动态链接的方式与标准库进行链接;在链接过程中,编译器会提供动态库的地址,将程序与动态库链接,这也就意味着,如果动态库弄丢了,程序就无法完成编译在这里插入图片描述

4.2静态链接

相较于动态链接,静态链接会将标准库拷贝到程序当中;Linux中,默认没有下载静态库

sudo yum -y install gibc-static          #静态库的下载gcc xxx -o xxx -staic                    #以静态链接的方式链接程序

在这里插入图片描述

动态链接的优缺点:

  • 节省资源,所有程序共用一个动态库
  • 一旦动态库弄丢了,所有程序都无法执行

静态链接的优缺点:

  • 浪费空间,由于每一个程序都需要拷贝一份静态库,会消耗很多空间在这里插入图片描述
  • 程序链接后,不管有没有静态库,该程序都可以运行

5. make/makefile


make是一个命令,makefile是一个文件;执行make命令时,会去当前目录查找有没有makefile文件,如果有,会去执行makefile文件中的代码

make和makefile的应用场景:

  • 每次使用gcc编译一个源文件时,都需要【gcc xxx -o xxx】,那如果有上百个源文件需要编译,难道对每个源文件都执行一次gcc指令,显然太麻烦了;而make/makefile就是一次性处理多个文件

5.1makefile的编写

利用make/makefile,我们要实现的功能是,使用【make】指令可以自动编译源文件;使用【make clean】指令自动帮我们清除项目

在这里插入图片描述

5.2makefile的原理

在使用【make指令】时,会在makefile文件执行遇到的第一个命令;同时,默认情况下,如果生成的目标文件是最新的,不会进行二次执行;根本原因是因为,编译一个程序是需要花费时间的;对于一个大工程,编译会花费很长时间,试想你好不容易编译好了文件,而如果不小心执行了【make】命令,就会再去浪费时间编译;因此make默认不会执行最新的文件
在这里插入图片描述

执行make指令后,怎么知道我的目标文件是最新的?

  • 使用【stat】指令,可以看到文件的修改时间,【Modify time】,这个时间是文件内容被修改的时间;由于一定是先有源文件,才有对应的可执行程序,所以如果源文件是最新的,它的时间一定比可执行程序新;通过比较源文件和对应可执行程序的【Modify time】
  • 如果源文件的时间更新,表示需要重新编译
  • 如果对应可执行程序的时间更新,不会进行二次编译

在这里插入图片描述

对于编译源文件,我的确需要比较时间,防止程序被重复编译;但对于某些指令,比如清除杂项,我需要它总是被执行,这样比较时间对我来说就比较多余了,能不能再执行【make】指令时,不比较时间,让目标指令总是被执行?

在编写makefile时,可以对指令进行【.PHONY】修饰,这样目标指令就是总是被执行的状态了

在这里插入图片描述

如果我们写出详细的过程,发现依然能达成我们想要的结果,只不过多生成了几个文件

在这里插入图片描述

makefile会从上往下执行代码,如果某段代码没有对应的依赖文件,会暂时记录该代码,往下寻找对应的依赖文件,最后再依次返回,有点像递归的操作;但必须把最终的目标文件写在开头,因为makefile一旦找到一个能执行的代码,就只执行一次

当然,我们之后写makefile不可能这么复杂,我们可以写的更加简介在这里插入图片描述

6.Linux工具的综合使用

6.1 倒计时小程序

6.1.1 缓冲区

在这里插入图片描述

代码1现在屏幕上打印,再休眠3秒;代码2先休眠3秒,再在屏幕上打印

造成这样结果的原因是什么?实际上,Linux中一切皆文件,我们的键盘,屏幕分别有着对应的键盘文件,显示器文件;而在内存中,这两个文件又有着对应的缓冲区,我们能在屏幕上看到数据,本质是缓冲区中的数据刷新到了显示器文件

有三种方式会刷新缓冲区:

  1. 遇到【\n】或者程序结束
  2. 缓冲区满了
  3. 使用fflush强制刷新缓冲区

为什么以【\n】作为刷新缓冲区的标志?想要在内存和文件之间传输数据,一次传输的数据量越多,传输的次数越少,传输的效率也就越高,而如果传输的数据过多,又不方便我们阅读,因此以行作为刷新缓冲区的标志是一种即提高效率,又方便阅读的做法

6.1.2 代码实现

在这里插入图片描述

7. git和github


7.1 git是什么

git是一款代码分布式管理工具,也可以叫做版本控制工具,由Linus Torvalds发明

7.2 git的起源

Linus Torvalds发布Linux系统后,收到了一大批关于Linux的代码,他需要不停的将这些代码组合在一起;有一天,他实在无法忍受了,想着有没有一款能帮我汇总代码的软件,他去市面上找,确实是有,但它收费,这与Linus Torvalds本人发布Linux时的理念相违背;可是软件的老板声称可以让他免费使用该软件,都到了这份情面上了,不用白不用;但好景不见风长,Linux社区中的某些人想着能不能破解该软件,但被软件老板知道了这件事,于是停止了给Linus Torvalds的软件免费使用权;既然不给我用,那干脆我就自己写一个代码管理的软件,这便是git的起源

通过git我们可以提交本地代码到远程仓库,下载相应客户端来查看仓库,但下载客户端又显得麻烦,于是就有了网站式的代码托管平台(github)

7.3 git的操作

首先在gitee或者github上创建好仓库,将远程仓库地址拷贝到Linux中,我们本地仓库就多了一些文件

在这里插入图片描述

在这里插入图片描述

8.gdb


8.1 release和debug的区别

我们都知道,市面上的软件一般有两个版本,release和debug,二者有什么区别呢?

一款软件经过测试没有问题后,面向用户发布的版本叫做release版本,它相对于debug版本做了一些优化,删除了调试信息,因此不能进行调试;当然,对于用户本就不需要调试,因此release版本删除调试信息是合理的,但对于程序员,调试就异常关键,而面向程序员发布的版本就叫做debug版本;由于debug版本加上了调试信息,因此在文件大小上会大于release版本

Linux中默认情况下使用gcc编译源文件产生的可执行程序是release版本,想要在编译的过程中加上调试信息,需要在gcc编译加上-g选项

在这里插入图片描述

在这里插入图片描述

8.2 gdb的操作

指令作用
list(简写为l)+行号/函数名显示对应的源代码
b+文件名:行号/函数名打断点
info(简写为i)+b查看断点
d+断点编号删除断点
disable/enable+断点编号使能(关闭/打开)断点
run(简写为r)运行程序
next(简写为n)逐过程
step(简写为s)逐语句
print(简写为p)+变量查看变量内容或地址
display+变量变量跟随
undisplay+变量编号取消变量跟随
continue(简写为c)移动到下一个断点处
finish直接运行完当前函数停下来
until+行号跳转至指定行
set var+变量主动设置变量的值
info(i)+local查看当前栈帧的局部变量
bt查看函数调用关系
+变量变量跟随
undisplay+变量编号取消变量跟随
continue(简写为c)移动到下一个断点处
finish直接运行完当前函数停下来
until+行号跳转至指定行
set var+变量主动设置变量的值
info(i)+local查看当前栈帧的局部变量
bt查看函数调用关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/268825.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3分钟,学会一个测试员必懂 Lambda 小知识!

今天再来给大家介绍下函数式接口和方法引用。 函数式接口 问:Lambda 表达式的类型是什么? 答:函数式接口 问:函数式接口是什么? 答:只包含一个抽象方法的接口,称为函数式接口 (…

制作耳机壳的UV树脂耳机壳UV胶和塑料材质有什么不同?

制作耳机壳的UV树脂耳机壳UV胶和塑料材质有什么不同? 制作耳机壳的UV树脂和塑料材质在以下几个方面存在区别: 硬度与耐磨性:UV树脂具有较高的硬度和耐磨性,能够有效保护耳机内部零件,延长耳机使用寿命。而塑料材质相…

价格腰斩,腾讯云2024优惠活动云服务器62元一年,多配置报价

腾讯云服务器多少钱一年?62元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器218元一年、756元3年,4核16G12M服务器32元1个月、312元一年,8核32G22M服务器115元1个月、345元3个月,腾讯云服务器网txyfwq.co…

linux安装mysql5.7

linux安装mysql5.7 一、下载mysql5.7二、解压包介绍三、上传包到linux四、卸载mariadb五、安装mysql六、修改权限七、启动mysql八、使用过navicat创作不易,笔记不易,如觉不错,请三连,谢谢~~ 一、下载mysql5.7 去mysql官方下载&am…

数据结构题目①——数组

前言 本篇文章为博主进行代码随想录——数组练习后的总结会涉及到每一道题目的详细的思路整理,以及本人的易错点,希望对大家有所帮助 数组介绍: 数组在C语言中就已经有所涉及,它是一个最基础的数据结构,而在数据结构中…

Oracle 11g升级19c 后部分查询功能很慢

*Oracle 11g升级19c 后部分查询功能很慢 今天生产突然有个查询非常慢,日志显示执行了50秒左右,但是从日志中拿出SQL在PLSQL执行,发现用时不到1秒,查看SQL,怀疑是下面几种原因导致 1、使用函数不当 UNIT.UNIT_CODE LIKE CONCAT(‘…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体,自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型,通常…

排序——堆排序

本节继续复习排序算法。这次复习排序算法中的堆排序。 堆排序属于选择排序。 目录 什么是堆? 堆排序 堆排序的思想 堆排代码 向下调整算法 堆排整体 什么是堆? 在复习堆排序之前, 首先我们需要回顾一下什么是堆 。 堆的本质其实是一个数…

11.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏接收网络数据包的操作

内容参考于:易道云信息技术研究院VIP课 上一个内容:接管游戏发送数据的操作 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:8256eb53e8c16281bc1a29cb8d26d352bb5bbf4c 代…

负载均衡.

简介: 将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。 负载均衡的分类: 网络通信分类 四层负载均衡:基于 IP 地址和端口进行请求的转发。七层负载均衡:根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机。 载体维度分类 硬…

绕过付费,畅享网络:自由浏览付费内容 | 开源日报 No.185

iamadamdev/bypass-paywalls-chrome Stars: 38.8k License: NOASSERTION bypass-paywalls-chrome 是一个用于 Chrome 和 Firefox 的网页浏览器扩展,可帮助绕过特定网站的付费墙。 可以绕过多个指定网站的付费墙支持自动更新(仅限 Firefox 版本&#x…

从头构建gpt2 基于Transformer

从头构建gpt2 基于Transformer VX关注{晓理紫|小李子},获取技术推送信息,如感兴趣,请转发给有需要的同学,谢谢支持!! 如果你感觉对你有所帮助,请关注我。 源码获取 VX关注晓理紫并回复“chatgpt…

消息中间件之RocketMQ源码分析(二十九)

延迟消息投递机制 RocketMQ在存储延迟消息时,将其保存在一个系统的Topic中,在创建ConsumeQueue时,tagCode字段中保存着延迟消息需要被投递的时间,通过这个存储实现的思路,我们可以总结出延迟消息的投递过程:通过定时服…

C++入门07 数组、指针与字符串

图源:文心一言 听课笔记简单整理,供小伙伴们参考~🥝🥝 第1版:听课的记录代码~🧩🧩 编辑:梅头脑🌸 审核:文心一言 目录 🐳课程来源 &#x1…

逆序遍历字符串(不改变内存地址)

题目:逆序遍历字符串"ABCDEFG" 实现思路: 使用StringBuilder创建对象,因为String字符串是不可变的,而StringBuilder内部的方法没有被final关键字修饰,所以将s1的字符串内容传给StringBuilder创建的对象ret…

模拟算法题练习(一)(扫雷,灌溉,回文日期)

目录 模拟算法介绍: (一、扫雷) (二、灌溉) (三、回文日期) 有一说一这题大佬的题解是真的强 模拟算法介绍: 模拟算法通过模拟实际情况来解决问题,一般容易理解但是实…

c语言游戏实战(10):坤坤的篮球回避秀

前言: 这款简易版的球球大作战是博主耗时两天半完成的,玩家需要控制坤坤在游戏界面上移动,来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代…

SpringMVC01、回顾MVC

1、回顾MVC 1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。…

Node.js中的并发和多线程处理

在Node.js中,处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的,这意味着它在任何给定时间内只能执行一个任务。然而,Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中,我们将探讨…

恋爱话术小程序源码支持多种流量主模式

源码介绍 这就是一款恋爱话术小程序,该款小程序相对来说还是挺强大的 这款小程序基本分段都是和外面几千块几百块的分段是一样的,基本就是从开场-情绪-聊天-升级-邀约-约会等几大分类开始 然后每一大分类下面都有N个小分类来做识别 另外也支持输入对方的话或关键词获取相关的话…