☰
linux面试题
2026/9/28 20:28:50 网站建设 项目流程

Linux/C++ 后端面试题:

适合 Linux/C++ 后端入门复习。答案以面试口述为目标,代码片段用于说明关键用法。项目题中的技术栈、并发量和压测数据必须根据自己的真实项目修改。

目录

  • 一、Linux 命令与开发工具(1—24)
  • 二、进程、线程与同步(25—45)
  • 三、网络与 I/O 多路复用(46—59)
  • 四、MySQL 与 Redis(60—73)
  • 复习顺序与追问链

一、Linux 命令与开发工具(1—24)

1.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_dir

rm -r会递归删除目录,使用前先核对路径。

4. Linux 文件权限怎么看?

ls -l的权限位依次表示文件类型、所有者、所属组、其他用户的读r、写w、执行x权限。目录上的x表示可进入或遍历,和普通文件的执行含义不同。

5.chmod 755是什么意思?

r=4、w=2、x=1。755表示所有者rwx,组用户和其他用户r-x:

chmod755run.sh

6.chown有什么作用?

修改文件所有者及所属组,例如sudo chown user:group file。是否能修改取决于当前权限。

7. 软链接和硬链接有什么区别?

软链接是保存目标路径的特殊文件,可跨文件系统,目标消失后通常成为悬空链接;硬链接是同一 inode 的另一个目录项,通常不能跨文件系统,也通常不允许对目录创建。ln -s target link创建软链接,ln target link创建硬链接。

8. 管道和重定向分别做什么?

|将前一个命令的标准输出接入后一个命令的标准输入;>覆盖输出文件,>>追加,2>重定向标准错误。例如:

psaux|grepserver ./server>server.log2>&1

9. 如何查看磁盘空间与文件大小?

df -h查看文件系统空间,du -sh directory查看目录占用,ls -lh file查看文件大小。三者统计对象不同。

10.find和grep的区别?

find按名称、类型等查找文件;grep搜索文件内容。查代码内容也可使用速度较快的rg:

find.-name'*.cpp'rg'main\('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.logsed's/hello/world/g'input.txt

14. 如何查看进程?

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按依赖关系构建。例如(命令行前必须是 Tab):

server: main.o server.o g++ main.o server.o -o server

23.make如何判断要不要重新构建?

主要比较目标和依赖文件的修改时间:目标不存在,或依赖比目标更新时,执行相应规则。头文件应列为依赖,否则修改头文件可能不会触发重编译;项目中可生成自动依赖文件。

24. 静态库和动态库的区别?

静态库常见后缀.a,链接时所需代码并入可执行文件;共享库常见后缀.so,动态链接的程序运行时需要找到兼容的库。共享库可被多个进程映射共享,版本和部署路径需管理好。

二、进程、线程与同步(25—45)

25. 什么是进程?

进程是程序的一次运行实例,拥有独立的虚拟地址空间等资源,并由内核记录运行状态、调度信息等。程序文件是静态的,进程是运行中的实体。

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 等锁 2,B 持锁 2 等锁 1。

41. 死锁的四个必要条件和解决办法?

互斥、请求并保持、不可剥夺、循环等待同时成立时才可能形成死锁。统一锁获取顺序可以破坏循环等待;C++ 多锁场景可用std::scoped_lock一次协调获取多个互斥量。还可缩小持锁范围、避免持锁等待外部操作。

42. 进程和线程有什么区别?

同一进程内线程共享地址空间、堆和进程级资源,但每个线程有自己的栈、寄存器上下文和线程标识。进程提供资源隔离,线程是进程中的执行流;具体调度单位取决于操作系统实现。

43. 为什么同进程线程切换通常比进程切换轻?

同进程线程共享地址空间,切换时通常无需更换整个地址空间;进程切换还涉及内存映射等状态。不过两者都要保存/恢复执行上下文,实际成本受缓存、TLB、调度和硬件影响。

44.mutex和semaphore的区别?

互斥锁用于对临界区的互斥访问,有加锁与解锁的所有权语义;计数信号量维护许可数量,适合限制最多 N 个并发使用者或表示资源数量。不要把信号量机械地当作所有锁的替代品。

45. 条件变量是什么?

它使线程在某个条件不成立时释放锁并等待,收到通知后重新获得锁、检查条件:

std::unique_lock<std::mutex>lock(mutex);cv.wait(lock,[&]{return!queue.empty()||stopping;});

notify_one()唤醒一个等待者;notify_all()唤醒所有等待者。通知本身不等于条件成立,必须检查共享谓词。

三、网络与 I/O 多路复用(46—59)

46. OSI 七层与 TCP/IP 分层?

OSI 从上到下为应用、表示、会话、传输、网络、数据链路、物理层。常用的 TCP/IP 四层表述为应用、传输、网际、网络接口层。它们是理解协议职责的模型,实际协议未必严格落在单一层。

47. TCP 与 UDP 的区别?

TCP 提供面向连接、可靠有序的字节流,并有流量与拥塞控制;UDP 保留数据报边界,协议本身不保证可靠送达或顺序。应用可在 UDP 上自行实现可靠性。HTTP/3 使用 QUIC(基于 UDP),因此不能笼统说 HTTPS 一定走 TCP。

48. TCP 三次握手的过程和目的?

客户端发送 SYN;服务端回复 SYN+ACK;客户端回复 ACK。双方交换并确认初始序列号,协商部分连接参数,服务端在收到第三次报文后确认客户端收到了自己的 SYN。面试时避免只用“四项收发能力”解释全部设计。

49. 为什么不是两次握手?

两次后服务端无法确认自己的 SYN 已被客户端收到,难以使双方对连接建立及序列号状态形成一致认知。三次握手也有助于处理过期 SYN 等情况;不要把“防止旧请求”当成唯一原因。

50. TCP 关闭为什么通常是四个报文?

TCP 双向数据流可分别关闭:一方 FIN、对方 ACK,然后对方 FIN、原发送方 ACK。若 ACK 与 FIN 可以一起发送,也可能合并为三个报文;“四次”描述的是典型过程。

51. 主动关闭方为什么进入TIME_WAIT?

保持一段时间以便对方重传 FIN 时重新发送最后的 ACK,并降低旧连接延迟报文干扰相同四元组新连接的风险。教材通常用2MSL解释等待时间,具体实现由系统控制。

52. HTTP 和 HTTPS 的常见端口?

HTTP 通常为 80,HTTPS 通常为 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/O?

ET 收到可读通知后,通常持续读取直到EAGAIN/EWOULDBLOCK。若 socket 阻塞,在数据读完后的下一次读取可能卡住事件循环。还要处理recv返回0(对端关闭)、EINTR(重试)和其他真实错误:

for(;;){ssize_t n=recv(fd,buf,sizeof(buf),0);if(n>0){/* 处理 n 字节 */}elseif(n==0){/* 对端关闭 */break;}elseif(errno==EINTR)continue;elseif(errno==EAGAIN||errno==EWOULDBLOCK)break;else{/* 错误处理 */break;}}

59.libevent是什么?

一个事件驱动库,提供事件注册、回调、事件循环和缓冲事件等接口,可在不同平台选择相应的底层 I/O 多路复用机制,如 epoll、kqueue、poll、select。

四、MySQL 与 Redis(60—73)

60. 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 Set(ZSet)是经典五类;此外有 Stream 等类型。Bitmap、HyperLogLog、Geo 通常基于底层结构和专门命令提供能力,不宜简单当成与经典五类完全并列的底层类型。

70. RDB 与 AOF 的区别?

RDB 在特定时点生成快照,恢复通常较快,但快照间隔内的数据可能丢失;AOF 记录写命令或其重写后的形式,持久性受刷盘策略影响,也有文件和恢复开销。可根据版本和配置组合使用。

71. 什么是缓存穿透?

请求反复查询不存在的键,缓存未命中后继续打到数据库。可校验参数、缓存空结果并设置适当过期时间,或用布隆过滤器过滤大量确定不存在的键。

72. 什么是缓存击穿?

热点键失效时大量并发请求同时回源。可使用单飞/互斥重建、逻辑过期或针对热点设置合适的更新策略;需考虑锁失效和旧值可接受程度。

73. 什么是缓存雪崩?

大量键集中失效或缓存服务整体不可用,造成数据库流量激增。可错开过期时间、预热、多级缓存、限流和提升缓存可用性,同时保护数据库。

复习顺序与追问链

  1. 先能清楚解释:进程与线程、fork、僵尸进程、死锁条件、TCP/UDP、握手挥手、TIME_WAIT、select/poll/epoll、事务 ACID。
  2. 再讲清原理:写时复制、条件变量、线程池、ET 非阻塞、B+ 树、事务隔离、缓存穿透/击穿/雪崩。

一条典型追问链:

为什么用 epoll?→ LT/ET 差别?→ ET 为什么配非阻塞?→recv返回-1一定是故障吗?→ 如何处理EAGAIN、EINTR和对端关闭?

另一条典型追问链:

如何防止重复预约?→ 进程内锁够吗?→ 数据库唯一约束如何设计?→ 两个请求同时到达会怎样?→ 失败或超时后如何确认最终结果?

复习时先自己口述,再针对答不清的环节写最小可运行示例。项目介绍以代码和测试记录为准。

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

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

立即咨询