视源科技 CVTE 嵌入式软件技术支持一面:C 语言基础与 Linux 实操
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
综合与行为
- 自我介绍。
- 有没有参加过社团、学生会这类经历?(面试官围绕校园经历追问得比较多)
- 如果你周末正在爬山,客户给你打电话,你会怎么办?
- 大学期间做过的最有意义的事情是什么?
C 语言
- static 有什么作用?
- 指针和数组有什么区别?数组的优势是什么?指针的优势是什么?
Linux
- 进程和线程的区别?进程是怎么调度的?
- 怎么杀死进程?
- 怎么查看运行内存?
- 创建一个 cvte.sh 文件怎么弄?
《参考解析》
static 要按「修饰谁」分三种场景答。 修饰局部变量时改变的是存储期——变量从栈上挪到静态存储区,函数退出后值仍然保留,因此它天生不是线程安全的,重入函数或中断里用它要格外小心;修饰全局变量或函数时改变的是链接属性,符号从外部链接变成内部链接,只在当前编译单元可见,这是 C 里做「文件私有」的标准手段;修饰类成员(C++)则是类级共享,不属于任何对象。追问常落在「static 变量存在哪个段」:已初始化的放 .data,未初始化或初值为 0 的放 .bss,由启动代码在进 main 之前统一清零。嵌入式里最好再补一句实际用法——把中断与主循环共享的标志量用 static 收在文件内,避免污染全局命名空间又被别处误改。
指针和数组的区别要说清「类型」与「能否移动」。 数组名在大多数表达式里退化为指向首元素的指针,但它是不可修改的左值:不能自增、不能整体赋值;sizeof 得到整个数组的字节数,而指针的 sizeof 是地址宽度;&arr 的类型是数组指针,&arr + 1 跨过整个数组,指针加一却只跨过一个元素。数组的优势是内存连续、长度信息明确、缓存友好、编译器能更好地做别名与边界优化,做定长缓冲区最自然;指针的优势是灵活,可以指向任意位置、承载动态分配、串起链表与回调,传参时只传一个地址。主动提一句「函数形参写成数组其实就是一个指针,长度信息在传参时就丢了」,以及数组越界编译器不会报错,比只背概念更像真写过 C。
进程与线程从内核视角答:资源分配单位对调度单位。 进程有独立地址空间、页表、文件描述符表和信号处理等资源;线程共享同一地址空间,只独占栈、寄存器上下文和线程本地存储,因此创建与切换开销小得多,代价是一个线程崩溃会带走整个进程,共享数据的同步也得自己保证。调度这块要能说出 Linux 的 CFS:按虚拟运行时间 vruntime 在红黑树上选最左节点,权重由 nice 值决定,交互型任务因为睡眠多会积攒调度优势;实时任务走 SCHED_FIFO / SCHED_RR 的优先级队列,优先级高于普通任务。最后补上上下文切换的代价——保存恢复寄存器、切页表,以及 Cache 与 TLB 变冷,这正是「线程切换更便宜但同样不能滥用」的原因。
Linux 实操题考命令熟不熟,最好连参数一起说。 杀进程要分清信号:kill <PID> 默认发 SIGTERM(15,可被程序捕获,留给它优雅退出的机会),kill -9 是 SIGKILL,不可捕获、资源也不会被清理,只能在 15 无效时用;按名字批量处理用 pkill / killall,但先 pgrep 确认目标,别误杀同名进程。看内存:free -h 看整体,top / htop 看进程占用,cat /proc/meminfo 看细节,注意 free 里的 available 才是真正还能用多少,buff/cache 是可回收的,不能只看 used 就断定内存不足。新建脚本是 vim cvte.sh 写完内容后 chmod +x cvte.sh 赋可执行权限,再 ./cvte.sh 运行——面试时把这句「记得赋权」说出来是加分点,漏掉它是新手最常见的坑。
客户应急场景别答「立刻放下一切下山」。 这道题考的是服务意识与判断力,答法拆三步:先接起电话问清对方是谁、问题有多急、影响面多大,能当场给出定位方向的先给;再判断严重程度——只是操作疑问可以约时间回电,如果是产线停机这类必须立刻处理的,就地找有信号的地方远程连线,同时把同行的人安排好,必要时让同事顶上;最后一定留痕,记录客户诉求与承诺的响应时间,并同步给直属主管,避免自己不在工位造成信息真空。落点是「先响应、再处理、有预案」,外加一句自己的周末行程会提前报备,把客户支持讲成职业习惯而不是临时反应。