ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux系统(02):基础开发工具

Linux系统(02):基础开发工具 如果你在阅读过程中有任何疑问或想要进一步探讨的内容欢迎在评论区畅所欲言我们一起学习、共同成长~ 如果你觉得这篇文章还不错不妨顺手点个赞、加入收藏并分享给更多的朋友噢~1. Linux 软件包管理器 - yum1.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、FedoraUbuntu 用 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 编辑器 - vim2.1 vim 模式基础【必考核心】vim 为多模式编辑器主要辅助我们写代码。开发只考察 3 种核心模式其余模式【冷门了解】。vim 文件名文件已存在打开该文件进入编辑文件不存在在内存开辟缓冲区进入编辑执行保存后磁盘上生成该文件2.1.1 三大模式定义命令模式 (NORMAL)执行“vim 文件名”指令默认进入命令模式光标移动、删除、复制、粘贴、撤销无法输入文字插入模式 (INSERT)唯一文本编辑输入模式底行模式 (COMMAND)文件保存退出、查找、执行 shell 指令、分屏。2.1.2 模式切换① 命令模式→插入模式输入i或a或oi光标当前位置插入a光标后一位插入o光标下方新建空行插入只有插入模式下Enter键换行、自动缩进Backspace键删除光标前字符② 命令模式→底行模式Shift ;实际就是输入冒号:③ 插入 / 底行模式→命令模式Esc 键⚠️【高频易错】新手踩坑一直停留在插入模式无法直接进入底行模式保存退出。记住必须先切回命令模式才能切换底行模式。2.2 NORMAL 命令模式快捷键【必考核心】2.2.1 光标移动基础移动h 左、j 下、k 上、l(L的小写) 右行定位^行首、$行尾全文跳转gg 文档开头、ShiftG 文末、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撤销上一步操作Ctrlr恢复撤销反撤销【面试常考配对记忆】2.2.5 替换、改写r光标所在1个字符允许改写覆盖R光标所在字符开始向后都允许改写覆盖输入改写内容完毕后按 Esc 终止cw删除光标所在单词并进入插入模式cnw删除光标所在单词开始向后的 n 个单词并进入插入模式2.2.6 转换大小写~光标所在字符转换大小写n~光标所在字符开始向后 n 个字符转换大小写2.2.7 翻页Ctrlf 下翻一页Ctrlb 上翻一页Ctrld 下翻半页Ctrlu 上翻半页。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命令模式下先按住Ctrlw松开后按一下 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/用户名/.vimrcroot 用户/root/.vimrc兼容普通用户 root ~/.vimrc2.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/g3.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 test3.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-staticComplete! 安装完毕后再执行静态链接才不会出现如图报错。gcc test.c -o test_static -static查看链接类型file test test_static3.3.4 面试官连环追问问生产环境业务程序优先动态还是静态链接答线上服务优先动态链接节省服务器内存嵌入式、离线工具使用静态链接保证兼容。4. Linux 调试器 - gdb4.1 程序发布方式debug/release版本【必考核心】releasegcc/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自动输出该变量值省去反复 printundisplay 编号取消指定编号变量的常显示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/Makefile5.1 基础概念【必考核心】Makefile文本文件记录着依赖关系和编译指令makeLinux 命令工具解析 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文件后再次执行makemake 只重新编译改动过的.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简易进度条
返回列表