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 all
                   
    yum makecache
                   
    yum 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查看函数调用关系

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【推荐】免费AI论文写作神器-「智元兔 AI」

还在为写论文焦虑?免费AI写作大师来帮你三步搞定! 智元兔AI是ChatGPT的人工智能助手,并且具有出色的论文写作能力。它能够根据用户提供的题目或要求,自动生成高质量的论文。 不论是论文、毕业论文、散文、科普文章、新闻稿件&…

OpenAI工作环境曝光:高薪背后的996;Quora的转变:由知识宝库至信息垃圾场

🦉 AI新闻 🚀 OpenAI工作环境曝光:高薪背后的996 摘要:近日,多位OpenAI匿名员工在求职网站Glassdoor上披露了公司的工作环境和公司文化,包括高薪水和优厚的福利待遇,但同时伴随着996的加班文化…

【大厂AI课学习笔记NO.62】模型的部署

我们历尽千辛万苦,总算要部署模型了。这个系列也写到62篇,不要着急,后面还有很多。 这周偷懒了,一天放出太多的文章,大家可能有些吃不消,从下周开始,本系列将正常更新。 这套大厂AI课&#xf…

二叉树的右视图,力扣

目录 题目: 我们直接看题解吧: 快速理解解题思路小建议: 审题目事例提示: 解题方法: 解题分析: 解题思路: 代码实现(DFS): 代码1: 补充说明: 代码2&#xff1…

XUbuntu22.04之如何定制:已经绑定的快捷键?(二百一十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

挑战杯 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层:2.4 池化层:2.5 全连接softmax层:2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

Linux/Docker 修改系统时区

目录 1. Linux 系统1.1 通过 timedatectl 命令操作1.2 直接修改 /etc/localtime 文件 2. Docker 容器中的 Linux 操作环境: CentOS / AlmaOSMySQL Docker 镜像 1. Linux 系统 1.1 通过 timedatectl 命令操作 使用 timedatectl list-timezones 命令列出可用的时区…

HM2019改变粘合层网格厚度的方法

如图所示,这里需要改变黄色层的厚度,改变效果如下 操作步骤:

golang实现openssl自签名双向认证

第一步:生成CA、服务端、客户端证书 1. 生成CA根证书 生成CA证书私钥 openssl genrsa -out ca.key 4096创建ca.conf 文件 [ req ] default_bits 4096 distinguished_name req_distinguished_name[ req_distinguished_name ] countryName …

【网站项目】137微博系统网站

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

PowerBI怎么修改数据库密码

第一步:点击转换数据 第二步:点击数据源设置 第三步:点击编辑权限 第四步:点击编辑 第五步:输入正要修改的密码就可以了

WebStorm激活与安装(全网最快捷、最靠谱的方法)

前言: 相信很多小伙伴已经开始了前端的学习之旅,想要更快乐的学习当然少不了WebStorm这个得力的开发工具软件。但是WebStorm是付费的,免费版功能有太少,怎么才能既免费,又能使用上正式版呢!当然还是激活啦…

Java:JVM基础

文章目录 参考JVM内存区域程序计数器虚拟机栈本地方法栈堆方法区符号引用与直接引用运行时常量池字符串常量池直接内存 参考 JavaGuide JVM内存区域 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,各线程…

C++之结构体以及通讯录管理系统

1,结构体基本概念 结构体属于自定义的数据概念,允许用户存储不同的数据类型 2,结构体的定义和使用 语法:struct 结构体名{ 结构体成员列表}; 通过结构体创建变量的方式有三种: 1,struct …

一副耳机如何同时连接两台设备?双设备连接教学,耳机流转自如

或是夜深的宿舍、或是安静的图书馆……当你戴着耳机怡然自得地用平板煲着剧,手机突然来电,划破宁静的铃声想必让你尴尬无比、手忙脚乱。 想避免这种尴尬,其实也很简单,只需要使用华为的双设备连接的功能,即可“一副耳…

nosql的注入

一、SQL注入数据库分类 关系型数据库 mysql oracle sqlserver 非关系型数据库 key-value redis MongoDB(not only sql) 二、MongoDB环境搭建 自己官网下载 Download MongoDB Community Server | MongoDB 其中Mongod.exe是它的一个启动 加上数据库&…

Amazon Q :企业级的对话智能导航

前言 目前市面上的许多 AI 智能助手主要局限于开发者和一般用户的使用,对于企业级开发的支持相对较少。然而,随着时代的发展,针对企业发展的定制化 AI 解决方案变得愈发重要。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里…

arm板运行程序时寻找动态库的路径设置

问题:error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file? 第一种方法---- 解决: ①复制需要用到的arm库到板子上。 ②pwd指令获取该库的绝对路径,把路径复制到/etc/ld.so.conf文件 ③输…

c++ 基于范围的for循环详解

在for循环中基于复杂对象我们使用引用,这样可以避免对象拷贝,提升性能。 如果确认不会修改引用对象,请在前面加上const限定符。帮助编译器生成更加高效的代码。 如果是基础类型,直接使用值即可。 C11引入了一种更简洁、统一的循…

每日一题——LeetCode1572.矩阵对角线元素的和

方法一 遍历矩阵 如果矩阵中某个位置(x,y)处于对角线上,那么这个位置必定满足: xy 或 xy len-1 (len为矩阵长度) var diagonalSum function(mat) {let len mat.length;let sum 0;for (let i 0; i …