面灵AI→

科大讯飞嵌入式一面:pty 透传、Unix 域套接字与双通道设计

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍
  2. pty 伪终端透传技术是什么?
  3. skill 如何编写?
  4. AI 风险如何管控,如何评估 AI 生成代码的风险?
  5. Unix 域套接字相对于 TCP/IP 套接字的优势是什么?
  6. 执法记录仪双通道的作用是什么,为什么选择双通道而不是单通道?
  7. UI 主线程不处理耗时业务的原因是什么?
  8. SQLite 多线程访问如何注意?
  9. 嵌入式的学习路径是怎样的?
  10. 芯片选型以及如何开发?

《参考解析》

pty 伪终端透传:pty 是一对虚拟终端设备,包含 master 端(由控制进程持有)与 slave 端(表现为 /dev/pts/N,被当成真实终端使用)。内核在中间维护行规程,所以经过 slave 的数据会获得终端语义:行缓冲与回显、Ctrl-C 之类控制字符产生的信号、窗口大小(TIOCSWINSZ)、以及 termios 参数。透传的场景是控制进程从别处(网络连接、串口、SSH 会话)拿到字节流,写进 master,由 slave 侧的程序当作终端输入处理,输出再反向回传。相对普通管道,pty 的价值就是这层终端语义——没有它,被代理的程序会认为 stdin/stdout 不是终端,从而关掉交互模式、丢失信号处理、显示错乱。实现上要处理非阻塞读写与 select/poll、窗口大小变更的转发、以及 EOF 与连接断开时的清理(否则会留下僵尸会话)。

skill 的编写:这里的 skill 指把一类任务的领域知识固化成可复用的能力单元。一份可用的 skill 至少要写清四件事:触发条件(什么场景该用它,边界在哪)、输入输出契约(参数含义、返回结构与失败表现)、执行步骤与关键判断(步骤顺序、每一步的检查点、常见坑)、以及示例与失败处理(正反例、异常时怎么降级或求助)。和一次性 prompt 的区别在于它要被反复调用、被不同人调用,因此要版本化、要能评测(用固定用例回归),并且把确定性的事情交给代码、把需要判断的事情留给模型。写不好的典型症状是把流程写成散文、缺少失败分支、以及把与任务无关的常识塞进去。

AI 生成代码的风险评估:嵌入式里用 AI 写代码的风险比业务后端更集中:内存与算力预算被无声超支、时序与实时性被破坏(在中断上下文里做了阻塞操作或动态分配)、硬件寄存器与位定义写错、错误路径上的资源释放被漏掉。管控办法是分层的:入口限制(只让它写有清晰接口、可测试的模块,不让它改启动代码、中断处理和驱动时序)、过程校验(编译告警清零、cppcheck/clang-tidy、单测与边界用例、ASan/UBSan)、出口验证(上板实测、长时间稳定性与压力测试、逻辑分析仪或示波器看时序)。评估一段生成代码时要能逐条回答:内存谁分配谁释放、失败路径怎么走、并发假设是什么、依赖的库在目标平台有没有。人必须能做到解释每一行,否则就不算通过。

Unix 域套接字与 TCP/IP 的区别:AF_UNIX 走的是内核内部的 IPC 通道,不经过网络协议栈,没有三次握手、校验和、拥塞控制与路由查找,因此延迟更低、吞吐更高,也没有端口占用与防火墙问题;寻址用文件系统路径(或抽象命名空间),访问控制可以直接借文件的读写权限来做,天然限定了「只能本机访问」,安全性优于监听在 127.0.0.1 的 TCP(后者任何本机进程都能连)。它同样支持 SOCK_STREAM 与 SOCK_DGRAM,语义上与 TCP/UDP 类似,还能通过 SCM_RIGHTS 在进程间传递文件描述符,这是 TCP 做不到的。代价是只能用于本机进程间通信、跨机器就得换回 AF_INET/AF_INET6,另外用它做通信要注意 socket 文件的重建与清理、以及文件权限设置。

双通道设计与 UI 主线程:双通道在这里是两条并行的数据或链路。常见的动机有三类:冗余(主备链路,一路故障另一路顶上,提升可靠性)、分工(如本地录像与远程回传并行、不同码率或不同传感器各走一路,互不阻塞)、以及性能与隔离(把高带宽数据与低频控制信令分开,避免互相拖慢)。选双通道而不是单通道,通常是因为单通道要么成为瓶颈(带宽/处理能力不足),要么存在单点故障。回答时要把它落回具体业务指标:哪条通路上跑什么数据、单通道撑不住的点在哪里、切换逻辑如何触发、两路数据如何对齐与同步。UI 主线程不处理耗时业务的原因则在于它同时负责事件循环与界面绘制:一旦阻塞,事件积压、界面无响应甚至被系统判定 ANR,用户体验直接崩掉。正确做法是把耗时任务放工作线程或线程池,通过信号槽或回调把结果投回主线程更新界面,并注意共享数据加锁、界面对象只在主线程操作、以及给长任务进度与取消能力。

SQLite 多线程访问、学习路径与芯片选型:SQLite 有三种线程模式:single-thread(完全不能跨线程)、multi-thread(同一连接不能跨线程,不同连接可以)、serialized(默认,连接内部加锁可跨线程)。注意点包括:一个连接在同一时刻只应被一个线程使用,多线程写建议各自短事务或用单写线程串行化;写是库级排他锁,两个写事务会得到 SQLITE_BUSY,要设置 busy_timeout 或按退避重试;开启 WAL 能显著提升读写并发(读不阻塞写),但要处理多出来的 -wal/-shm 文件与检查点;批量插入放进一个事务里,并考虑 PRAGMA synchronous 与索引数量的权衡;嵌入式里还要关注掉电一致性、文件系统与闪存寿命。学习路径建议按「C 语言与数据结构 → MCU 与寄存器/外设 → 通信总线(UART/I2C/SPI/CAN)→ RTOS 与并发 → Linux 与驱动 → 完整项目」推进,每一步都要有能跑起来的实物。芯片选型则从需求反推:算力与主频、Flash/RAM、需要的外设与接口数量、功耗与供电、工作温度等级、封装与成本、供货周期与长期可用性、工具链与生态支持,选完再评估移植成本。