💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!
👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!
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 核心基础认知【必考核心】
- yum 适用系统:CentOS、RedHat、Fedora(Ubuntu 用 apt,笔试选择题常考系统包管理器辨析)。
- 核心特性:yum 进程独占锁,同一服务器同一时刻仅允许 1 个 yum 进程运行。
⚠️【高频易错】多终端同时 yum 安装会直接报错Another app is currently holding the yum lock - 联网前提:yum 下载包必须联网,验证联网指令:
ping www.baidu.com,不断自动打印表明当前处于联网状态。
1.3 yum 查询软件包【必考核心】
1.3.1 基础查询指令
yum list:列出当前软件源所有可安装软件包;yum list | grep 软件名:精准过滤目标软件(常用)。
以查询 lrzsz 为例,
1.3.2 软件包命名格式【高频易错】
主版本号.次版本号.源程序发行号-软件包发行号.系统版本.cpu架构
yum list 指令部分打印结果如下,由格式可知 包名opentrep-doc | 版本0.07.4 | 包发行号2 | 系统el7 | 架构noarch
- 架构:
① x86_64 指 64 位 CentOS7,当前服务器主流;
② i686 指 32 位包,现代服务器基本淘汰; - 系统版本:el7 就是 CentOS7/RHEL7,选型错误会安装失败;
- 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 会连带卸载该软件依赖的无关组件,生产环境谨慎卸载系统依赖包。
通用说明:
- -y:自动确认同意安装/卸载,无需手动输入yes;
- 结束标识:终端出现
Complete!代表安装/卸载成功。
1.5 常见 yum 指令补充
- yum makecache:下载源软件包元数据,本地缓存
- yum search 关键字:搜索软件包名称、描述
- yum clean all:清理 yum 本地缓存(元数据、缓存 rpm 包,不会卸载已安装软件)
1.6 文件互传工具:lrzsz(高频实操考点)
rz -E:本地文件 → 上传至 Linux 当前目录。-E:存在同名旧文件时自动改名防止覆盖旧文件;sz 文件名:Linux 文件 → 下载至本地指定文件夹。
常见报错:rz 弹窗不显示
原因:Xshell、SecureCRT 终端不支持 rz 协议
解决方案:更换终端工具、使用宝塔、xftp 替代传输
本章高频面试题
服务器 yum 卡死,无法安装软件如何排查修复?
标准思路:查看 yum 锁文件→检索占用进程→强杀进程→删除 pid 锁文件→重试 yum 指令。
2. Linux 编辑器 - vim
2.1 vim 模式基础【必考核心】
vim 为多模式编辑器,主要辅助我们写代码。开发只考察 3 种核心模式,其余模式【冷门了解】。
vim 文件名
- 文件已存在:打开该文件进入编辑
- 文件不存在:在内存开辟缓冲区进入编辑,执行保存后磁盘上生成该文件
2.1.1 三大模式定义
- 命令模式 (NORMAL):执行“vim 文件名”指令默认进入命令模式,光标移动、删除、复制、粘贴、撤销,无法输入文字;
- 插入模式 (INSERT):唯一文本编辑输入模式;
- 底行模式 (COMMAND):文件保存退出、查找、执行 shell 指令、分屏。
2.1.2 模式切换
① 命令模式→插入模式:输入i或a或o
i:光标当前位置插入;a:光标后一位插入;o:光标下方新建空行插入;
- 只有插入模式下:Enter键换行、自动缩进;Backspace键删除光标前字符
② 命令模式→底行模式:Shift + ;(实际就是输入冒号:)
③ 插入 / 底行模式→命令模式:Esc 键
⚠️【高频易错】新手踩坑:一直停留在插入模式,无法直接进入底行模式保存退出。记住:必须先切回命令模式,才能切换底行模式。
2.2 NORMAL 命令模式快捷键【必考核心】
2.2.1 光标移动
- 基础移动:h 左、j 下、k 上、l(L的小写) 右;
- 行定位:
^行首、$行尾; - 全文跳转:gg 文档开头、Shift+G 文末、nG 跳转第 n 行;
- 单词跳转: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 上翻一页;
- 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 分屏编辑【进阶拔高,二面实操】
- COMMAND 进入垂直分屏 :vs 文件名(每执行1次新增1个垂直窗口)
- 命令行进入垂直分屏:vim -O 文件名1 文件名2(要分配几个文件就写几个文件名)
- NORMAL命令模式下先按住Ctrl+w,松开后
按一下 w:光标在所有窗口切换
按一下 =:所有窗口等宽
2.3.4 临时执行 shell 指令
!指令:不退出 vim 时,shell指令前加!即可执行,如!ls查看当前目录文件。
2.3.5 替换
s/旧/新/g本行全部替换%s/旧/新/g全文替换
2.4 vim 配置【高频易错 + 进阶拔高】
2.4.1 两类配置文件
/etc/vimrc:全局配置,所有登录用户打开 vim 都生效,修改必须使用 root 管理员权限,不建议随意修改;- 当前用户家目录/.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 实操练手
- vim test.c
- 切换三大模式输入以下代码,底行模式下 wq 保存退出
- cat 打印查看文件内容
3. Linux 编译器 - gcc/g++
3.1 gcc/g++ 作用:编译四阶段【必考核心】
gcc 是 GNU 的 C 语言编译器,g++ 是 GNU 的 C++ 编译器。
gcc/g++ 编译固定 4 个阶段,后端 C++ 岗位必考原理,面试官常追问每阶段具体行为:
- 预处理:头文件展开、删除注释、宏定义替换、条件编译;生成 .i 文件;
- 编译:C/C++ 源码转为汇编指令;生成 .s 汇编文件;
- 汇编:汇编指令转为二进制码;生成 .o 目标文件;
- 链接:整合多个.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 可直接运行)
- 预处理:gcc -E test.c -o test.i
- 编译为汇编:gcc -S test.i -o test.s
- 汇编成目标文件:gcc -c test.s -o test.o
- 链接生成可执行文件:gcc test.o -o test
⚠️【高频易错】不指定 -o 输出文件名,默认生成可执行文件名为a.out
一键全流程编译(默认四阶段):
gcc test.c -o test
3.3 动态链接 & 静态链接【必考核心,面试高频追问】
3.3.1 基础定义
- 静态库:后缀
.a,编译链接时,库代码完整打包进可执行文件; - 动态库 (共享库):后缀
.so,编译仅记录依赖,程序运行时加载库。
3.3.2 优缺点对比
- 动态链接(gcc/g++ 默认)
✅优点:可执行文件体积小、磁盘内存复用、库升级无需重新编译程序;
❌缺点:依赖外部库,环境缺失程序直接崩溃,可移植性差; - 静态链接(-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版本【必考核心】
- release:gcc/g++ 默认版本,无调试信息(体积小),用于线上发布,无法 gdb 调试;
- debug:加 -g 选项编译生成(如 gcc test.c -g -o debug_test),嵌入源码调试信息(体积略大),专门用于调试。
4.2 gdb 核心指令【必考核心】
4.2.1 进入 gdb 调试
gdb 可执行debug程序名
4.2.2 程序运行控制
- r/run:从头启动程序;
- n/next:逐过程(一行行执行,遇到自定义函数调用跳过函数内部,直接跑完函数。C++ 调试最常用);
- s/step:逐语句(一行行执行,遇到自定义函数调用进入函数内部);
- c/continue:运行至下一个断点;
- finish:跑完当前函数,回到调用处;
- until 行号:直接跳转到指定行;
- set var 变量=x:运行中动态修改变量的值为x。
4.2.3 查看信息
- l/list n:查看第 n 行开始的10行源码;
l 函数名:查看函数源码; - p/print 变量:打印变量值;
p &变量:打印地址; - display 变量:常显示变量,即程序每次暂停(断点、单步 n/s)自动输出该变量值,省去反复 print;
undisplay 编号:取消指定编号变量的常显示; - bt:查看函数调用栈,展示函数嵌套调用关系(段错误崩溃首要排查指令,线上故障高频);
- i/info locals:查看当前栈帧的局部变量。
4.2.4 断点管理
- b/break n:在第 n 行设断点;
b/break 函数名:在该函数体内第 1 行设断点; - info b:查看所有已设断点;
- d/delete 断点编号:删除断点;
- disable/enable 断点编号:临时禁用 / 启用指定断点。
4.2.5 退出 gdb 调试
- q/quit
常规调试流程
- -g 编译生成 debug 版本可执行程序
- “gdb 程序名”进入 gdb 调试
- b 行号/函数名设置断点
- r 启动程序,程序在断点处暂停
- n/s 单步执行代码;p 变量打印变量值;bt查看函数调用栈
- q 退出 gdb 调试
4.3 高频排障场景【进阶拔高】
场景:程序运行段错误崩溃,无日志如何定位?
- -g 编译生成 debug 版本可执行程序
- “gdb 程序名”进入 gdb 调试
- r 运行程序,触发段错误崩溃
- bt 打印函数调用栈,直接定位崩溃所在函数与代码行
4.4 面试常考提问
- 问:next 和 step 区别?
答:next 执行函数调用直接一步跳过;step 会进入自定义函数内部逐行调试。 - 问:程序崩溃首选 gdb 哪条指令定位?
答:bt 查看调用栈。
5. Linux项目自动化构建 - make/Makefile
5.1 基础概念【必考核心】
- Makefile:文本文件,记录着依赖关系和编译指令;
- make:Linux 命令工具,解析 Makefile,自动执行 gcc/g++ 编译命令,生成可执行程序及中间产物;
- 核心价值:自动化编译,仅重新编译修改过的文件,大型工程避免重复全量编译。
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 个自动变量,
$@表示当前目标文件(冒号左侧);$^表示全部依赖文件(冒号右侧全部);$<表示第一个依赖文件(冒号右侧第一个)。
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 底层执行原理【进阶拔高・二面简答】
- make 检索当前目录的 Makefile/makefile;
- 锁定Makefile 的第一个目标为最终编译目标(不会生成全部目标);
- 对比目标文件与依赖文件修改时间,依赖更新则执行编译指令;
- 递归查找依赖的子目标,逐层构建;文件缺失直接报错终止。
6. 实操落地:Linux 进度条小程序
6.1 行缓冲区原理【必考核心】
显示器采用行刷新策略: printf 输出内容不会直接打印到屏幕,而是先存放到缓冲区。
只有满足下面任意一种,缓冲区内容才会输出到屏幕:
- 遇到
\n换行符 - 缓冲区被写满
- 程序正常结束
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)简易进度条