博雷顿科技股份公司 C++ 三面复盘

1. epoll 两种触发方式:LT 和 ET

  • LT只要 fd 上还有可读/可写事件,epoll_wait 每次都会返回该事件。 优点是简单,不容易漏事件;缺点是通知可能更频繁。
  • ET只有状态“发生变化”时才通知一次(例如从不可读变成可读)。 如果这次没把数据处理完,后续可能收不到提醒,容易“饿死”连接。 优点是高性能,减少重复通知;缺点是编程复杂、容易出错。

2. ET 模式注意点

使用要点:

  • fd 必须设为非阻塞(O_NONBLOCK)
  • 可读事件到来后要循环读,直到返回 EAGAIN/EWOULDBLOCK
  • 可写事件同理,循环写到 EAGAIN 或发送完
  • 一般配合 EPOLLONESHOT 防止并发线程重复处理同一 fd
  • 必须处理半包/粘包、对端关闭、异常等边界情况

一句话记忆:ET = 一次通知,必须“榨干”缓冲区。

3. TCP 服务端常见状态(你说的“状态码”通常指状态机)

常见状态:

  • LISTEN:服务端监听端口
  • SYN_RECV:收到客户端 SYN,回 SYN+ACK,等待 ACK
  • ESTABLISHED:连接建立完成,可收发数据
  • FIN_WAIT_1 / FIN_WAIT_2:主动关闭一方的状态
  • CLOSE_WAIT:被动关闭方收到 FIN,等待应用层 close
  • LAST_ACK:被动关闭方发出 FIN,等待最后 ACK
  • TIME_WAIT:主动关闭方等待 2MSL,确保对端收到 ACK

面试高频补充:CLOSE_WAIT 多通常是应用层没及时 close()。

4. TCP 三次握手 / 四次挥手

三次握手

1) 客户端发 SYN(seq=x) 2) 服务端回 SYN+ACK(seq=y, ack=x+1) 3) 客户端回 ACK(ack=y+1)

目的:双方确认“收发能力”和初始序列号可用。

四次挥手

1) 主动关闭方发 FIN 2) 被动关闭方回 ACK(进入 CLOSE_WAIT) 3) 被动关闭方处理完数据后发 FIN 4) 主动关闭方回 ACK,进入 TIME_WAIT

TIME_WAIT 作用:防止旧报文干扰新连接、保证最后 ACK 可重传。

5. 对客户端的理解

客户端是离用户最近的一层,核心目标是体验、稳定、性能。 它不仅是界面层,还承担网络交互、数据缓存、状态管理、异常恢复等职责。 客户端开发价值在于:

  • 快速把业务能力触达用户
  • 对性能和细节要求高(启动速度、卡顿、功耗、崩溃率)
  • 需要和服务端/产品/测试高频协作,工程综合能力要求高

6. 未来职业发展规划

短期我就想把技术基本功真正做扎实,把 技术打牢,做到一个模块从方案、开发、性能优化到上线问题排查都能自己独立扛下来(其实网上看了不少, 真到说的时候了, 又有点懵 , 胡诌了几句)

7. 算法题整理

题目:给定二叉树中的某个结点 node,返回中序遍历中它的前一个结点(前驱结点)。

默认结点有 left/right/parent 指针(面试里可先确认)。

分两种情况:

1) node 有左子树

  • 前驱就是其左子树中“最右侧”的结点

2) node 没有左子树

  • 沿 parent 向上找,直到当前结点是其父结点的右孩子
  • 这个父结点就是前驱
  • 若一路都找不到,说明它是中序第一个结点,前驱为 nullptr
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode* parent;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr), parent(nullptr) {}
};

TreeNode* inorderPredecessor(TreeNode* node) {
    if (node == nullptr) return nullptr;

    // 情况1:有左子树 -> 左子树最右结点
    if (node->left) {
        TreeNode* p = node->left;
        while (p->right) p = p->right;
        return p;
    }

    // 情况2:无左子树 -> 向上找第一个“当前结点是其右孩子”的祖先
    TreeNode* cur = node;
    TreeNode* p = node->parent;
    while (p && p->left == cur) {
        cur = p;
        p = p->parent;
    }
    return p;
}

`

C++面试总结 文章被收录于专栏

本专栏系统梳理C++面试高频考点,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务