Linux系统(02):基础开发工具
2026/8/14 16:48:48 网站建设 项目流程

💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!

👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!


1. Linux 软件包管理器 - yum

1.1 Linux 安装软件三类方式【必考核心】

安装方式原理优缺点
源码编译源码编译安装,执行 configure、make、make install自定义参数;步骤繁琐,依赖需手动处理
rpm 包本地预编译二进制包,rpm -ivh 安装无需编译;不会自动补依赖
yum(常用)rpm 前端工具,联网下载 rpm 包,自动解析依赖一键管理、自动补依赖;需要联网、有 yum 锁
结论:后端开发日常业务部署优先用 yum;定制库用源码编译;rpm 仅用于离线简单安装。

面试常规追问

问:rpm 和 yum 核心区别?

答:rpm 只负责本地安装,无依赖自动处理;yum 封装 rpm,联网自动安装依赖包。

1.2 yum 核心基础认知【必考核心】

  1. yum 适用系统:CentOS、RedHat、Fedora(Ubuntu 用 apt,笔试选择题常考系统包管理器辨析)。
  2. 核心特性:yum 进程独占锁,同一服务器同一时刻仅允许 1 个 yum 进程运行
    ⚠️【高频易错】多终端同时 yum 安装会直接报错Another app is currently holding the yum lock
  3. 联网前提:yum 下载包必须联网,验证联网指令:ping www.baidu.com,不断自动打印表明当前处于联网状态。

1.3 yum 查询软件包【必考核心】

1.3.1 基础查询指令

  1. yum list:列出当前软件源所有可安装软件包;
  2. yum list | grep 软件名:精准过滤目标软件(常用)。
    以查询 lrzsz 为例,

1.3.2 软件包命名格式【高频易错】

主版本号.次版本号.源程序发行号-软件包发行号.系统版本.cpu架构

yum list 指令部分打印结果如下,由格式可知 包名opentrep-doc | 版本0.07.4 | 包发行号2 | 系统el7 | 架构noarch

  1. 架构:
    ① x86_64 指 64 位 CentOS7,当前服务器主流;
    ② i686 指 32 位包,现代服务器基本淘汰;
  2. 系统版本:el7 就是 CentOS7/RHEL7,选型错误会安装失败;
  3. base/epel 等:软件源名称,源异常会导致下载失败(类似“小米应用商店”)。

1.4 yum 安装 / 卸载软件【必考核心】

安装指令

sudo yum install [-y] 软件名

⚠️权限约束:由于安装软件会修改系统目录,必须切换 root 账号(无需 sudo 选项。普通用户无权限直接安装系统软件)或者赋予普通用户 sudo 权限使用 sudo(① su - root 切换登录 root 账号,② usermod -aG wheel 用户名 将指定普通用户加入管理员组,③ 关闭 Xshell 会话,重新登录该普通用户,才可以使用 sudo)。

卸载指令

sudo yum remove [-y] 软件名

⚠️【高频易错】yum remove 会连带卸载该软件依赖的无关组件,生产环境谨慎卸载系统依赖包。

通用说明:

  1. -y:自动确认同意安装/卸载,无需手动输入yes;
  2. 结束标识:终端出现Complete!代表安装/卸载成功。

1.5 常见 yum 指令补充

  1. yum makecache:下载源软件包元数据,本地缓存
  2. yum search 关键字:搜索软件包名称、描述
  3. yum clean all:清理 yum 本地缓存(元数据、缓存 rpm 包,不会卸载已安装软件)

1.6 文件互传工具:lrzsz(高频实操考点)

  1. rz -E:本地文件 → 上传至 Linux 当前目录。-E:存在同名旧文件时自动改名防止覆盖旧文件;
  2. sz 文件名:Linux 文件 → 下载至本地指定文件夹。

常见报错:rz 弹窗不显示

原因:Xshell、SecureCRT 终端不支持 rz 协议

解决方案:更换终端工具、使用宝塔、xftp 替代传输

本章高频面试题

服务器 yum 卡死,无法安装软件如何排查修复?

标准思路:查看 yum 锁文件→检索占用进程→强杀进程→删除 pid 锁文件→重试 yum 指令。


2. Linux 编辑器 - vim

2.1 vim 模式基础【必考核心】

vim 为多模式编辑器,主要辅助我们写代码。开发只考察 3 种核心模式,其余模式【冷门了解】。

vim 文件名

  1. 文件已存在:打开该文件进入编辑
  2. 文件不存在:在内存开辟缓冲区进入编辑,执行保存后磁盘上生成该文件

2.1.1 三大模式定义

  1. 命令模式 (NORMAL):执行“vim 文件名”指令默认进入命令模式,光标移动、删除、复制、粘贴、撤销,无法输入文字
  2. 插入模式 (INSERT):唯一文本编辑输入模式;
  3. 底行模式 (COMMAND):文件保存退出、查找、执行 shell 指令、分屏。

2.1.2 模式切换

① 命令模式→插入模式:输入i或a或o

  1. i:光标当前位置插入;
  2. a:光标后一位插入;
  3. o:光标下方新建空行插入;
  • 只有插入模式下:Enter键换行、自动缩进;Backspace键删除光标前字符

② 命令模式→底行模式:Shift + ;(实际就是输入冒号:)

③ 插入 / 底行模式→命令模式:Esc 键

⚠️【高频易错】新手踩坑:一直停留在插入模式,无法直接进入底行模式保存退出。记住:必须先切回命令模式,才能切换底行模式。

2.2 NORMAL 命令模式快捷键【必考核心】

2.2.1 光标移动

  1. 基础移动:h 左、j 下、k 上、l(L的小写) 右;
  2. 行定位:^行首、$行尾;
  3. 全文跳转:gg 文档开头、Shift+G 文末、nG 跳转第 n 行;
  4. 单词跳转:w 下一词开头、e 下一词结尾、b 上一词开头;

2.2.2 删除操作

  • x:删光标所在位置字符;nx:删光标所在位置开始向后的 n 个字符;
  • X:删光标所在位置前1个字符;nX:删光标所在位置前n个字符;
  • dd:删除/剪切光标所在行;ndd:删除/剪切光标所在行开始向下的 n 行;

2.2.3 复制、粘贴

  • yy:复制光标所在行;nyy:复制光标所在行开始向下的 n 行;
  • yw/nyw:复制光标所在位置开始向后的 1 个 / n 个单词;
  • p:在光标下一行粘贴已复制/剪切内容;np:在光标下一行粘贴 n 次已复制/剪切内容;

2.2.4 撤销与回退

  • u:撤销上一步操作;
  • Ctrl+r:恢复撤销(反撤销);【面试常考配对记忆】

2.2.5 替换、改写

  • r:光标所在1个字符允许改写覆盖;R:光标所在字符开始向后都允许改写覆盖,输入改写内容完毕后按 Esc 终止;
  • cw:删除光标所在单词并进入插入模式;cnw:删除光标所在单词开始向后的 n 个单词并进入插入模式;

2.2.6 转换大小写

  • ~:光标所在字符转换大小写;
  • n~:光标所在字符开始向后 n 个字符转换大小写;

2.2.7 翻页

  • Ctrl+f 下翻一页;
  • Ctrl+b 上翻一页;
  1. Ctrl+d 下翻半页;
  • Ctrl+u 上翻半页。

2.3 COMMAND 底行模式指令【必考核心】

输入指令后回车执行

2.3.1 行号控制

  • set nu:显示行号;set nonu:关闭行号;

2.3.2 保存退出回到命令行(面试最高频基础提问)

  • w:保存;
  • q:正常退出(无修改才可退出);q! 强制不保存退出;
  • wq:保存并退出;wq! 强制保存退出;

2.3.3 分屏编辑【进阶拔高,二面实操】

  1. COMMAND 进入垂直分屏 :vs 文件名(每执行1次新增1个垂直窗口)
  2. 命令行进入垂直分屏:vim -O 文件名1 文件名2(要分配几个文件就写几个文件名)
  • NORMAL命令模式下先按住Ctrl+w,松开后
    按一下 w:光标在所有窗口切换
    按一下 =:所有窗口等宽

2.3.4 临时执行 shell 指令

  • !指令:不退出 vim 时,shell指令前加!即可执行,如!ls查看当前目录文件。

2.3.5 替换

  1. s/旧/新/g本行全部替换
  2. %s/旧/新/g全文替换

2.4 vim 配置【高频易错 + 进阶拔高】

2.4.1 两类配置文件

  1. /etc/vimrc:全局配置,所有登录用户打开 vim 都生效,修改必须使用 root 管理员权限,不建议随意修改;
  2. 当前用户家目录/.vimrc:用户私有配置,仅当前登录用户生效,其他用户登录不生效(个人定义 vim 的首选配置文件)。
    普通用户:/home/用户名/.vimrc
    root 用户:/root/.vimrc
    兼容普通用户 + root :~/.vimrc

2.4.2 一键部署 C++ 专用 vim 配置(CentOS7 直接可用)

vim 配置比较复杂,不建议自己一一配置,简单做法是命令行直接执行以下指令(想在哪个普通用户下让 vim 配置生效,就在哪个用户下执行该指令,⚠️不推荐 root 用户执行该指令)

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

然后按提示输入 root 账户密码、手动输入执行 source ~/.bashrc。

脚本自动生成 ~/.vimrc 美化配置,重新打开 vim,配置自动生效。

2.5 实操练手

  1. vim test.c
  2. 切换三大模式输入以下代码,底行模式下 wq 保存退出
  3. cat 打印查看文件内容

3. Linux 编译器 - gcc/g++

3.1 gcc/g++ 作用:编译四阶段【必考核心】

gcc 是 GNU 的 C 语言编译器,g++ 是 GNU 的 C++ 编译器。

gcc/g++ 编译固定 4 个阶段,后端 C++ 岗位必考原理,面试官常追问每阶段具体行为:

  1. 预处理:头文件展开、删除注释、宏定义替换、条件编译;生成 .i 文件;
  2. 编译:C/C++ 源码转为汇编指令;生成 .s 汇编文件;
  3. 汇编:汇编指令转为二进制码;生成 .o 目标文件;
  4. 链接:整合多个.o 文件、链接系统库,生成可执行程序。

3.2 gcc/g++ 常用编译选项【必考核心】

参数作用
-E只执行预处理,生成 .i 文件
-S预处理 + 编译,生成 .s 汇编文件
-c预处理 + 编译 + 汇编,生成 .o 目标文件
-o指定输出文件名
-g加入调试信息,生成 debug 版本,给 gdb 调试用
-static静态链接
-shared生成动态库(.so)
-O0/-O1/-O2/-O3编译优化等级,-O0 关闭优化(调试用),-O3 优化级别最高
-Wall开启全部编译警告
-w关闭全部编译警告

3.2.1 全流程实操示例(CentOS7 可直接运行)

  1. 预处理:gcc -E test.c -o test.i
  2. 编译为汇编:gcc -S test.i -o test.s
  3. 汇编成目标文件:gcc -c test.s -o test.o
  4. 链接生成可执行文件:gcc test.o -o test

    ⚠️【高频易错】不指定 -o 输出文件名,默认生成可执行文件名为a.out

一键全流程编译(默认四阶段):

gcc test.c -o test

3.3 动态链接 & 静态链接【必考核心,面试高频追问】

3.3.1 基础定义

  1. 静态库:后缀.a,编译链接时,库代码完整打包进可执行文件;
  2. 动态库 (共享库):后缀.so,编译仅记录依赖,程序运行时加载库

3.3.2 优缺点对比

  1. 动态链接(gcc/g++ 默认)
    ✅优点:可执行文件体积小、磁盘内存复用、库升级无需重新编译程序;
    ❌缺点:依赖外部库,环境缺失程序直接崩溃,可移植性差;
  2. 静态链接(-static 开启)
    ✅优点:不依赖外部库,随处可运行,移植性极强;
    ❌缺点:程序体积巨大、内存冗余、升级库需要全量重新编译。

3.3.3 实操验证

gcc test.c -o test 默认动态链接。

静态链接:

⚠️【高频易错】CentOS7 默认只提供动态库.so,静态库.a属于额外组件,需要手动安装对应 static 包(前置联动 1.4 yum 安装 / 卸载软件):

sudo yum install glibc-static libstdc++-static

Complete! 安装完毕后再执行静态链接才不会出现如图报错。

gcc test.c -o test_static -static

查看链接类型:

file test test_static

3.3.4 面试官连环追问

问:生产环境业务程序优先动态还是静态链接?

答:线上服务优先动态链接,节省服务器内存;嵌入式、离线工具使用静态链接保证兼容。


4. Linux 调试器 - gdb

4.1 程序发布方式:debug/release版本【必考核心】

  1. release:gcc/g++ 默认版本,无调试信息(体积小),用于线上发布,无法 gdb 调试
  2. debug:加 -g 选项编译生成(如 gcc test.c -g -o debug_test),嵌入源码调试信息(体积略大),专门用于调试。

4.2 gdb 核心指令【必考核心】

4.2.1 进入 gdb 调试

gdb 可执行debug程序名

4.2.2 程序运行控制

  1. r/run:从头启动程序;
  2. n/next:逐过程(一行行执行,遇到自定义函数调用跳过函数内部,直接跑完函数。C++ 调试最常用);
  3. s/step:逐语句(一行行执行,遇到自定义函数调用进入函数内部);
  4. c/continue:运行至下一个断点;
  5. finish:跑完当前函数,回到调用处;
  6. until 行号:直接跳转到指定行;
  7. set var 变量=x:运行中动态修改变量的值为x。

4.2.3 查看信息

  1. l/list n:查看第 n 行开始的10行源码;
    l 函数名:查看函数源码;
  2. p/print 变量:打印变量值;
    p &变量:打印地址;
  3. display 变量:常显示变量,即程序每次暂停(断点、单步 n/s)自动输出该变量值,省去反复 print;
    undisplay 编号:取消指定编号变量的常显示;
  4. bt:查看函数调用栈,展示函数嵌套调用关系(段错误崩溃首要排查指令,线上故障高频);
  5. i/info locals:查看当前栈帧的局部变量。

4.2.4 断点管理

  1. b/break n:在第 n 行设断点;
    b/break 函数名:在该函数体内第 1 行设断点;
  2. info b:查看所有已设断点;
  3. d/delete 断点编号:删除断点;
  4. disable/enable 断点编号:临时禁用 / 启用指定断点。

4.2.5 退出 gdb 调试

  • q/quit

常规调试流程

  1. -g 编译生成 debug 版本可执行程序
  2. “gdb 程序名”进入 gdb 调试
  3. b 行号/函数名设置断点
  4. r 启动程序,程序在断点处暂停
  5. n/s 单步执行代码;p 变量打印变量值;bt查看函数调用栈
  6. q 退出 gdb 调试

4.3 高频排障场景【进阶拔高】

场景:程序运行段错误崩溃,无日志如何定位?

  1. -g 编译生成 debug 版本可执行程序
  2. “gdb 程序名”进入 gdb 调试
  3. r 运行程序,触发段错误崩溃
  4. bt 打印函数调用栈,直接定位崩溃所在函数与代码行

4.4 面试常考提问

  1. 问:next 和 step 区别?
    答:next 执行函数调用直接一步跳过;step 会进入自定义函数内部逐行调试。
  2. 问:程序崩溃首选 gdb 哪条指令定位?
    答:bt 查看调用栈。

5. Linux项目自动化构建 - make/Makefile

5.1 基础概念【必考核心】

  1. Makefile:文本文件,记录着依赖关系和编译指令;
  2. make:Linux 命令工具,解析 Makefile,自动执行 gcc/g++ 编译命令,生成可执行程序及中间产物;
  3. 核心价值:自动化编译,仅重新编译修改过的文件,大型工程避免重复全量编译

5.2 依赖关系 & 依赖方法【必考核心】

  • 依赖关系:目标文件由哪些依赖文件生成,依赖文件修改则目标文件需要重新构建;
  • 依赖方法:由依赖文件生成目标文件的 shell 编译命令。 示例:test.o 依赖 test.c,依赖方法为gcc -c test.c -o test.o

5.3 多文件编译【高频易错】

✅标准工程方案:每个.c 单独编译为.o 目标文件,仅重编译修改的 .c 文件覆盖对应旧 .o 文件,再统一链接。

❌错误方案:每次修改单个文件,全部源码重新编译,效率极低。

5.4 项目清理【高频易错】

每次完整重建项目时,需要清理上一次编译产出的可执行程序与中间产物,避免旧文件带来干扰。如果手动逐条输入删除指令,操作繁琐且重复;因此可以把清理命令写入 Makefile,定义 clean 伪目标。

  • clean 为伪目标,不会被 make 默认执行,只能终端手动执行make clean调用;
  • .PHONY 修饰伪目标:无论当前目录是否存在同名文件,必须执行该规则,规避文件名冲突。
.PHONY:clean clean: rm -f 可执行程序名 .o文件名

5.5 简写 Makefile 文件的编译命令(笔试高频)

3 个自动变量,

  1. $@表示当前目标文件(冒号左侧);
  2. $^表示全部依赖文件(冒号右侧全部);
  3. $<表示第一个依赖文件(冒号右侧第一个)。

5.6 项目自动化构建全流程实操示例

确保目录下已有两个源码文件 make_main.c、make_calc.c

① 新建名为 Makefile/makefile 的文件

⚠️文件名必须与源码同目录,且严格区分大小写。

② 定义依赖关系与编译指令

Makefile 最基础的编写格式:先写依赖关系,再写依赖方法(编译命令)

⚠️【高频易错】gcc前面必须是 Tab 缩进,不能用空格,否则 make 报missing separator错误。

Makefile 简写版本:

# 可执行程序 MyTestApp:make_main.o make_calc.o gcc $^ -o $@ # 每个.c文件单独编译成.o目标文件 make_main.o:make_main.c gcc -c $< -o $@ make_calc.o:make_calc.c gcc -c $< -o $@ # 伪目标清理 .PHONY:clean clean: rm -f MyTestApp make_main.o make_calc.o

③ 终端手动执行“make”指令自动编译

增量编译特性: 修改任意一个.c文件后,再次执行make,make 只重新编译改动过的.c,生成新的.o,其余未改动的.o直接复用,最后重新链接生成可执行程序,避免全量重编译。

④ “./程序名”运行测试程序

一般在运行测试程序后,编译报错残留半成品/需要完整重建项目时,终端手动执行“make clean”删除可执行程序和所有中间产物。

5.7 make 底层执行原理【进阶拔高・二面简答】

  1. make 检索当前目录的 Makefile/makefile;
  2. 锁定Makefile 的第一个目标为最终编译目标(不会生成全部目标);
  3. 对比目标文件与依赖文件修改时间,依赖更新则执行编译指令;
  4. 递归查找依赖的子目标,逐层构建;文件缺失直接报错终止。

6. 实操落地:Linux 进度条小程序

6.1 行缓冲区原理【必考核心】

显示器采用行刷新策略: printf 输出内容不会直接打印到屏幕,而是先存放到缓冲区。

只有满足下面任意一种,缓冲区内容才会输出到屏幕:

  1. 遇到\n换行符
  2. 缓冲区被写满
  3. 程序正常结束
  4. fflush主动强制刷新

⚠️【高频易错】printf 输出内容没有\n时,数据会滞留在缓冲区,屏幕不会立刻看到打印内容。

示例理解:

printf("hello world\n"); sleep(3); 遇到 \n 立刻打印,休眠 3 秒程序结束。

printf("hello world"); sleep(3); 没有 \n 且不满足其他情况,于是内容暂存缓冲区,休眠 3 秒程序结束才打印。

6.2 \r 与 \n 辨析【高频易错】

  • \n:换行,光标下移一行;
  • \r:回车,光标跳到所在行行首,不会跳到下一行;

6.3 fflush (stdout)

作用:强制刷新标准输出缓冲区,把缓冲区数据立刻打印到屏幕(进度条、倒计时必备函数)。

要实现进度条、倒计时效果,如果使用\n,每次打印都会换行,会不断向下输出多行文本,无法实现同一行原地覆盖刷新。 但\r仅移动光标,不会触发行缓冲区自动刷新,因此必须搭配fflush(stdout)强制刷新,屏幕才能看到实时变化。

6.4 倒计时

Linux系统(02)简易倒计时

6.5 进度条

Linux系统(02)简易进度条

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询