linux面试题

发布时间:2026/9/28 20:28:54
linux面试题
Linux/C 后端面试题适合 Linux/C 后端入门复习。答案以面试口述为目标代码片段用于说明关键用法。项目题中的技术栈、并发量和压测数据必须根据自己的真实项目修改。目录一、Linux 命令与开发工具1—24二、进程、线程与同步25—45三、网络与 I/O 多路复用46—59四、MySQL 与 Redis60—73复习顺序与追问链一、Linux 命令与开发工具1—241.pwd、ls、cd分别做什么pwd显示当前目录ls -lah查看目录内容及文件详情cd /path切换目录。cd ..回到上级目录cd ~回到用户主目录。2. 绝对路径和相对路径有什么区别绝对路径从根目录/开始不依赖当前目录例如/home/user/main.cpp。相对路径以当前目录为基准例如./main.cpp、../src/main.cpp。3. 如何创建、复制、移动、删除文件或目录mkdir-pbuildcpmain.cpp backup.cppmvbackup.cpp old.cpprmold.cpprmdirempty_dirrm -r会递归删除目录使用前先核对路径。4. Linux 文件权限怎么看ls -l的权限位依次表示文件类型、所有者、所属组、其他用户的读r、写w、执行x权限。目录上的x表示可进入或遍历和普通文件的执行含义不同。5.chmod 755是什么意思r4、w2、x1。755表示所有者rwx组用户和其他用户r-xchmod755run.sh6.chown有什么作用修改文件所有者及所属组例如sudo chown user:group file。是否能修改取决于当前权限。7. 软链接和硬链接有什么区别软链接是保存目标路径的特殊文件可跨文件系统目标消失后通常成为悬空链接硬链接是同一 inode 的另一个目录项通常不能跨文件系统也通常不允许对目录创建。ln -s target link创建软链接ln target link创建硬链接。8. 管道和重定向分别做什么|将前一个命令的标准输出接入后一个命令的标准输入覆盖输出文件追加2重定向标准错误。例如psaux|grepserver ./serverserver.log219. 如何查看磁盘空间与文件大小df -h查看文件系统空间du -sh directory查看目录占用ls -lh file查看文件大小。三者统计对象不同。10.find和grep的区别find按名称、类型等查找文件grep搜索文件内容。查代码内容也可使用速度较快的rgfind.-name*.cpprgmain\(src/11.cat、more、less有什么区别cat直接输出内容more基础分页less支持前后翻页、搜索和跳转查看大文件一般用less file。12.head、tail有什么作用head -n 20 file查看前 20 行tail -n 20 file查看末尾 20 行tail -f server.log持续跟踪追加的日志。13.awk和sed的常见用途awk适合按字段提取、统计sed适合按行编辑、替换。例awk{print $1}access.logseds/hello/world/ginput.txt14. 如何查看进程ps aux或ps -ef查看进程快照top动态查看资源使用ps -p PID -o pid,stat,cmd可查看指定进程状态。15.kill的本质是什么向进程发送信号。kill -TERM PID请求其终止kill -KILL PID强制终止。默认发送SIGTERM。16.SIGTERM和SIGKILL有什么区别SIGTERM可以被程序捕获、忽略或处理便于优雅退出SIGKILL不能被捕获或忽略由内核强制终止。通常先尝试SIGTERM。17.、jobs、fg有什么作用./server 把作业放到当前 shell 的后台jobs查看该 shell 管理的作业fg %1将指定作业带回前台。后台作业不等同于完整的守护进程。18. GCC 编译经历哪些阶段预处理、编译、汇编、链接典型中间产物是.i、.s、.o、可执行文件。可以分别用gcc -E、gcc -S、gcc -c观察前几个阶段。19.gcc和g有什么区别g按 C 编译驱动处理源文件并在链接时自动加入 C 标准库gcc默认按文件扩展名判断语言但链接 C 程序时通常还需显式处理 C 标准库。常用g main.cpp -o main。20. GDB 常用命令有哪些先使用g -g -O0 main.cpp -o main保留便于调试的信息再运行gdb ./main。常用break断点、run、next、step、print、continue、backtrace、quit。21. GDB 的next和step区别next按源码行执行遇到函数调用通常不进入step通常进入有可调试信息的函数。优化、内联或缺少调试符号时表现可能不同。22. Makefile 的作用是什么描述目标、依赖和构建命令使make按依赖关系构建。例如命令行前必须是 Tabserver: main.o server.o g main.o server.o -o server23.make如何判断要不要重新构建主要比较目标和依赖文件的修改时间目标不存在或依赖比目标更新时执行相应规则。头文件应列为依赖否则修改头文件可能不会触发重编译项目中可生成自动依赖文件。24. 静态库和动态库的区别静态库常见后缀.a链接时所需代码并入可执行文件共享库常见后缀.so动态链接的程序运行时需要找到兼容的库。共享库可被多个进程映射共享版本和部署路径需管理好。二、进程、线程与同步25—4525. 什么是进程进程是程序的一次运行实例拥有独立的虚拟地址空间等资源并由内核记录运行状态、调度信息等。程序文件是静态的进程是运行中的实体。26.fork()的返回值是什么父进程中返回子进程 PID子进程中返回0失败返回-1且不创建子进程。调用后父子进程从fork()返回处分别执行。27.fork()后父子地址空间是什么关系父子进程拥有独立的虚拟地址空间。Linux 通常通过写时复制让二者初期共享物理页某一方写入时才按需复制相关页。也要注意父子可能共享同一个打开文件描述对应的内核打开文件状态例如文件偏移量。28. 什么是僵尸进程子进程退出后父进程尚未通过wait/waitpid等取得退出状态其进程表项保留通常显示为Z。它已不再执行但仍占用少量内核记录。29. 如何回收子进程父进程调用wait()或waitpid()处理SIGCHLD时也可在合适的循环中使用waitpid(-1, status, WNOHANG)回收多个已退出子进程。信号处理函数中只应调用异步信号安全的函数复杂工作留给主流程。30. 系统调用与库函数有什么区别系统调用是应用请求内核服务的接口库函数是用户空间库提供的接口可能进一步调用系统调用也可能完全在用户空间完成。printf通常先处理格式与缓冲再通过底层写入strlen一般无需陷入内核。31.open()返回什么成功返回非负文件描述符失败返回-1并设置errno。常见约定为0标准输入、1标准输出、2标准错误但程序可以重定向它们。32. 文件描述符是什么它是进程内引用打开文件等内核对象的非负整数可用于文件、socket、管道等。dup或fork可能让多个描述符引用同一个打开文件描述因而共享文件偏移等状态。33.exec族函数的作用用新程序映像替换当前进程的程序映像成功时不返回PID 保持不变。部分进程属性会保留设置了 close-on-exec 的文件描述符会在执行新程序时关闭。34. 为什么常用fork exec父进程先fork()创建子进程子进程通过exec()运行新程序父进程可继续运行并用waitpid()回收子进程。这是 shell 执行外部命令的经典方式之一。35. 常见进程间通信方式匿名管道、FIFO、Unix 域 socket、网络 socket、消息队列、共享内存、信号等。信号量和互斥量主要解决同步问题选型看是否跨主机、消息边界、吞吐量与同步需求。36. 共享内存为什么通常高效映射建立后多个进程可访问相同的物理内存交换数据时通常无须为每条消息经内核复制。但建立映射、缺页和同步仍有开销共享内存本身不保证互斥常需配合进程间同步机制。37. 什么是临界资源并发访问时必须协调的共享资源例如共享计数器、队列或文件状态。能否同时读写取决于具体不变式并非所有共享资源都要求任何时刻只有一个访问者。38. 什么是临界区访问共享状态且需要同步保护的代码段。例如count涉及读、改、写多线程同时执行会产生数据竞争可用互斥锁或原子操作保护。39. 生产者消费者问题如何解决用队列传递任务互斥锁保护队列和状态消费者用条件变量等待“非空”生产者入队后通知。等待时使用谓词循环应对虚假唤醒有界队列还需要处理“已满”和关闭状态。40. 什么是死锁一组线程或进程相互等待对方持有的资源导致它们无法继续。例如 A 持锁 1 等锁 2B 持锁 2 等锁 1。41. 死锁的四个必要条件和解决办法互斥、请求并保持、不可剥夺、循环等待同时成立时才可能形成死锁。统一锁获取顺序可以破坏循环等待C 多锁场景可用std::scoped_lock一次协调获取多个互斥量。还可缩小持锁范围、避免持锁等待外部操作。42. 进程和线程有什么区别同一进程内线程共享地址空间、堆和进程级资源但每个线程有自己的栈、寄存器上下文和线程标识。进程提供资源隔离线程是进程中的执行流具体调度单位取决于操作系统实现。43. 为什么同进程线程切换通常比进程切换轻同进程线程共享地址空间切换时通常无需更换整个地址空间进程切换还涉及内存映射等状态。不过两者都要保存/恢复执行上下文实际成本受缓存、TLB、调度和硬件影响。44.mutex和semaphore的区别互斥锁用于对临界区的互斥访问有加锁与解锁的所有权语义计数信号量维护许可数量适合限制最多 N 个并发使用者或表示资源数量。不要把信号量机械地当作所有锁的替代品。45. 条件变量是什么它使线程在某个条件不成立时释放锁并等待收到通知后重新获得锁、检查条件std::unique_lockstd::mutexlock(mutex);cv.wait(lock,[]{return!queue.empty()||stopping;});notify_one()唤醒一个等待者notify_all()唤醒所有等待者。通知本身不等于条件成立必须检查共享谓词。三、网络与 I/O 多路复用46—5946. OSI 七层与 TCP/IP 分层OSI 从上到下为应用、表示、会话、传输、网络、数据链路、物理层。常用的 TCP/IP 四层表述为应用、传输、网际、网络接口层。它们是理解协议职责的模型实际协议未必严格落在单一层。47. TCP 与 UDP 的区别TCP 提供面向连接、可靠有序的字节流并有流量与拥塞控制UDP 保留数据报边界协议本身不保证可靠送达或顺序。应用可在 UDP 上自行实现可靠性。HTTP/3 使用 QUIC基于 UDP因此不能笼统说 HTTPS 一定走 TCP。48. TCP 三次握手的过程和目的客户端发送 SYN服务端回复 SYNACK客户端回复 ACK。双方交换并确认初始序列号协商部分连接参数服务端在收到第三次报文后确认客户端收到了自己的 SYN。面试时避免只用“四项收发能力”解释全部设计。49. 为什么不是两次握手两次后服务端无法确认自己的 SYN 已被客户端收到难以使双方对连接建立及序列号状态形成一致认知。三次握手也有助于处理过期 SYN 等情况不要把“防止旧请求”当成唯一原因。50. TCP 关闭为什么通常是四个报文TCP 双向数据流可分别关闭一方 FIN、对方 ACK然后对方 FIN、原发送方 ACK。若 ACK 与 FIN 可以一起发送也可能合并为三个报文“四次”描述的是典型过程。51. 主动关闭方为什么进入TIME_WAIT保持一段时间以便对方重传 FIN 时重新发送最后的 ACK并降低旧连接延迟报文干扰相同四元组新连接的风险。教材通常用2MSL解释等待时间具体实现由系统控制。52. HTTP 和 HTTPS 的常见端口HTTP 通常为 80HTTPS 通常为 443。端口可以自定义且 HTTPS 可在 TCP 或 QUIC 上运行。53. GET 和 POST 区别GET 语义上用于获取资源按 HTTP 规范应安全且幂等POST 用于提交内容供目标资源处理通常不保证幂等。请求参数并非只能放在 URL 或请求体安全性取决于传输加密、认证、服务端设计等。54. 常见 HTTP 状态码状态码含义200请求成功301 / 302永久 / 临时重定向400请求语法等有问题401需要有效身份认证403服务端拒绝访问404资源未找到500服务端内部错误502网关收到无效上游响应503服务暂不可用55.select、poll、epoll区别select使用固定大小的fd_set每次调用需传入集合poll使用pollfd数组不受fd_set大小直接限制二者通常要遍历注册项。Linux 的epoll在内核维护关注集合并返回就绪事件适合大量连接、较少活跃连接的场景。系统调用次数和实际负载仍会影响性能。56.epoll为什么适合大量连接关注集合通过epoll_ctl维护不必每次等待都传递整个 fd 集合epoll_wait返回就绪事件应用主要处理活跃 fd。其优势取决于连接规模、活跃比例、回调逻辑和内核实现并非任何规模都更快。57. LT 与 ET 有什么区别LT水平触发下只要就绪条件仍成立就可能再次通知ET边缘触发下通常在状态出现变化时通知若没有把数据处理到暂时不可读/写可能错过后续处理机会。默认常用 LT。58. ET 为什么常配合非阻塞 I/OET 收到可读通知后通常持续读取直到EAGAIN/EWOULDBLOCK。若 socket 阻塞在数据读完后的下一次读取可能卡住事件循环。还要处理recv返回0对端关闭、EINTR重试和其他真实错误for(;;){ssize_t nrecv(fd,buf,sizeof(buf),0);if(n0){/* 处理 n 字节 */}elseif(n0){/* 对端关闭 */break;}elseif(errnoEINTR)continue;elseif(errnoEAGAIN||errnoEWOULDBLOCK)break;else{/* 错误处理 */break;}}59.libevent是什么一个事件驱动库提供事件注册、回调、事件循环和缓冲事件等接口可在不同平台选择相应的底层 I/O 多路复用机制如 epoll、kqueue、poll、select。四、MySQL 与 Redis60—7360. MySQL 是什么关系型数据库管理系统数据组织为表可通过 SQL 查询和修改。关系约束、索引、事务及存储引擎是常见面试重点。61. C/C 如何连接 MySQL使用相应客户端库创建连接、检查连接结果、执行语句、读取结果并释放资源。手拼 SQL 容易造成注入问题业务数据优先使用预处理语句和参数绑定。生产代码还需超时、错误处理和连接管理。62. 什么是事务把一组数据库操作作为一个逻辑工作单元提交或回滚。例如转账时扣款与入账应一起成功或一起失败最终还需由约束、隔离和业务逻辑维护正确性。63. ACID 分别是什么原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability。一致性指事务让数据库从一个满足约束的状态转到另一个满足约束的状态并非“任意业务操作自动正确”。64. 常见事务隔离级别READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。MySQL InnoDB 默认通常是REPEATABLE READ具体应以运行环境设置为准。65. 脏读、不可重复读、幻读脏读是读到尚未提交的修改不可重复读是同一事务重复读取同一数据得到不同结果幻读强调按条件再次查询时满足条件的行集合出现变化。隔离级别的实际表现还与快照读、当前读和数据库实现有关。66. 为什么数据库索引常用 B 树多路分支降低树高适合块存储和缓存页有序叶子结构支持范围扫描。索引是否有效仍取决于选择性、查询条件、覆盖索引和执行计划不能只凭数据结构判断性能。67. B 树与 B 树有什么区别B 树的内部节点也可存放记录B 树的内部节点主要用于导航记录位于叶子节点叶子按键值有序常便于范围遍历。具体数据库的叶子内容取决于聚簇索引或二级索引等实现。68. Redis 是什么高性能的内存数据存储系统支持多种数据结构、持久化与复制常用于缓存、计数、队列等场景。是否适合作为最终数据源要看一致性和持久化要求。69. Redis 常见数据类型String、List、Hash、Set、Sorted SetZSet是经典五类此外有 Stream 等类型。Bitmap、HyperLogLog、Geo 通常基于底层结构和专门命令提供能力不宜简单当成与经典五类完全并列的底层类型。70. RDB 与 AOF 的区别RDB 在特定时点生成快照恢复通常较快但快照间隔内的数据可能丢失AOF 记录写命令或其重写后的形式持久性受刷盘策略影响也有文件和恢复开销。可根据版本和配置组合使用。71. 什么是缓存穿透请求反复查询不存在的键缓存未命中后继续打到数据库。可校验参数、缓存空结果并设置适当过期时间或用布隆过滤器过滤大量确定不存在的键。72. 什么是缓存击穿热点键失效时大量并发请求同时回源。可使用单飞/互斥重建、逻辑过期或针对热点设置合适的更新策略需考虑锁失效和旧值可接受程度。73. 什么是缓存雪崩大量键集中失效或缓存服务整体不可用造成数据库流量激增。可错开过期时间、预热、多级缓存、限流和提升缓存可用性同时保护数据库。复习顺序与追问链先能清楚解释进程与线程、fork、僵尸进程、死锁条件、TCP/UDP、握手挥手、TIME_WAIT、select/poll/epoll、事务 ACID。再讲清原理写时复制、条件变量、线程池、ET 非阻塞、B 树、事务隔离、缓存穿透/击穿/雪崩。一条典型追问链为什么用 epoll→ LT/ET 差别→ ET 为什么配非阻塞→recv返回-1一定是故障吗→ 如何处理EAGAIN、EINTR和对端关闭另一条典型追问链如何防止重复预约→ 进程内锁够吗→ 数据库唯一约束如何设计→ 两个请求同时到达会怎样→ 失败或超时后如何确认最终结果复习时先自己口述再针对答不清的环节写最小可运行示例。项目介绍以代码和测试记录为准。