嵌入式Linux应用开发必备20道八股文
前言
最近在准备嵌入式Linux应用开发的面试,发现很多同学对这块的知识点掌握得比较零散。我自己整理了一份高频面试题,涵盖了进程线程、文件IO、网络编程、IPC等核心知识点,基本上覆盖了80%的面试场景。
这些题目都是我从牛客、CSDN、各大公司面经里整理出来的,有些是我自己面试时被问到的。分享出来希望能帮到正在准备面试的同学。
建议大家不要死记硬背,要理解原理,能用自己的话说出来。面试官最看重的是你的理解深度,而不是背书。
核心20道面试题
一、进程与线程(必考)
1. 进程和线程的区别?什么时候用进程,什么时候用线程?
2. 如何创建进程?fork()的返回值是什么?父子进程的执行顺序?
3. 僵尸进程和孤儿进程是什么?如何避免僵尸进程?
4. 线程的创建和销毁?pthread_create()和pthread_join()的作用?
5. 线程同步有哪些方式?互斥锁、条件变量、信号量的区别和使用场景?
二、进程间通信(高频)
6. 进程间通信(IPC)有哪些方式?各有什么优缺点?
7. 管道和命名管道的区别?如何使用?
8. 共享内存的原理?如何实现进程间共享内存?
9. 消息队列和信号量的使用场景?如何选择?
10. socket通信属于IPC吗?本地socket和网络socket的区别?
核心嵌入式面试八股文总结:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
三、文件IO(基础必会)
11. 标准IO和文件IO的区别?什么时候用fopen,什么时候用open?
12. 阻塞IO和非阻塞IO的区别?如何设置非阻塞?
13. select、poll、epoll的区别?epoll为什么高效?
14. 文件描述符是什么?如何理解"一切皆文件"?
15. mmap内存映射的原理和使用场景?与read/write的区别?
四、网络编程(重点)
16. TCP和UDP的区别?三次握手和四次挥手的过程?
17. socket编程的基本流程?服务端和客户端分别需要哪些步骤?
18. 如何实现一个高并发的服务器?多进程、多线程、IO多路复用如何选择?
19. TIME_WAIT状态是什么?为什么需要?如何避免大量TIME_WAIT?
20. 如何处理粘包问题?应用层协议如何设计?
如何高效准备这些面试题?
1. 分模块学习
不要一次性学完所有内容,按照模块来:
- 第1周:进程与线程(题目1-5)
- 第2周:进程间通信(题目6-10)
- 第3周:文件IO(题目11-15)
- 第4周:网络编程(题目16-20)
每个模块学完后,写几个demo验证一下,加深理解。
2. 动手实践
光看不练假把式,每个知识点都要写代码验证:
// 比如学fork(),就写个简单的demo
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
printf("子进程\n");
} else {
printf("父进程\n");
}
return 0;
}
建议在Linux虚拟机或开发板上实际运行,观察现象。
3. 理解原理,不要死记硬背
面试官最讨厌背书的,要能用自己的话解释清楚。
比如问"为什么需要TIME_WAIT状态",不要只说"为了确保连接正常关闭",要说清楚:
- 确保最后的ACK能到达对方
- 避免旧连接的数据包干扰新连接
- 2MSL的时间足够让所有数据包消失
4. 准备项目经历
面试官一定会问:"你在项目中用过这些技术吗?"
提前准备1-2个项目案例:
- 项目背景和需求
- 你用了什么技术(比如epoll实现高并发)
- 遇到了什么问题(比如内存泄漏、死锁)
- 如何解决的
- 最终效果如何
5. 模拟面试
找同学或学长进行模拟面试,练习表达能力。
面试时要注意:
- 回答问题有条理(1、2、3、4)
- 不会的不要瞎说,诚实表达
- 主动引导到自己熟悉的领域
- 准备好反问问题
学习资源推荐
书籍
- 《Unix环境高级编程》(APUE)- 必读经典
- 《Linux/UNIX系统编程手册》- 更详细
- 《Unix网络编程》卷1、卷2 - 网络编程圣经
视频
- B站搜"Linux系统编程"
- 慕课网的Linux系统编程课程
- 极客时间《Linux性能优化实战》
实践
- 自己搭建Linux虚拟机(Ubuntu/CentOS)
- 写一些小项目:聊天室、文件传输、简易shell
- 看开源项目源码:nginx、redis的网络模型
刷题
- 牛客网的Linux专项练习
- LeetCode的并发题目
- 各大公司的面经
常见误区
误区1:只看不练
很多同学只看书看视频,不动手写代码。结果面试时写不出来,或者写出来有bug。
建议:每个知识点都要写demo验证,最好能在开发板上跑起来。
误区2:追求高深,忽略基础
有些同学喜欢研究内核源码、驱动开发,但连基本的fork、pthread都说不清楚。
建议:先把应用层的基础打牢,再往底层深入。
误区3:死记硬背
背了一堆概念,但不理解原理,面试官一深挖就露馅。
建议:理解原理,能用自己的话解释,最好能画图说明。
误区4:不总结
学了很多但不成体系,面试时想不起来。
建议:做笔记,画思维导图,定期复习。
面试技巧
技术面
- 回答要有条理:用"首先、其次、最后"这样的结构
- 举例说明:理论结合实际,说说项目中怎么用的
- 主动引导:把话题引到自己熟悉的领域
- 不懂就说不懂:不要瞎编,可以说"这块我了解不深,但我知道XX"
项目面
- STAR法则:Situation(背景)、Task(任务)、Action(行动)、Result(结果)
- 突出难点:说说遇到的技术难题,如何解决的
- 量化成果:性能提升了多少,bug减少了多少
- 反思总结:这个项目让你学到了什么
HR面
- 准备自我介绍:1-2分钟,突出技术优势
- 了解公司:提前查公司业务、产品、技术栈
- 准备反问:问团队、技术栈、成长机会
- 展现态度:积极、好学、能吃苦
结语
这20道题基本覆盖了嵌入式Linux应用开发的核心知识点,认真准备的话,应对大部分公司的面试应该没问题。
但要注意,面试不是考试,不是背会答案就行。面试官更看重的是:
- 你对技术的理解深度
- 你的学习能力和解决问题的能力
- 你的项目经验和实战能力
- 你的表达能力和沟通能力
查看10道真题和解析