仿muduo实现高并发服务器——EPOLL设置与移除Poller.hpp管理Channel

目录

摘要

Poller.hpp 以 _epfd、_fdarr[MAX_EVENTS]、_channels 三个成员封装 epoll:UpdateEvent 表内存在则 MOD、否则 ADD,RemoveEvent DEL 后 erase,Poll 等 epoll_wait 返回后交出就绪 Channel。

代码仓库:https://gitee.com/btshadow/Ubuntu_learning/blob/master/October/10-19/muduo/src/server.hpp

注释

3.1 新知识

abort() 退出程序,处理无法继续的严格逻辑错误,构造内 epoll_create 失败即调用;strerror(errno) 把错误码译成字符串。

3.2 误区

find 返回的迭代器是整体,second 才是 Hash 里的结果,Poll 的 it->second 即此。

3.3 反思

编程习惯作用极大,~Channel 析构因此把问题定位到成员;现象先记下再思考即串证据链;gdb 里 fd 自 10 起,不必奇怪。

3.4 习惯养成

调 bug 必记日志,须长期坚持;例:明明发送了数据为何是 0?图一 发送了,未通知??

正文

构造里 epoll_create(256) 失败即 abort(),循环把 _fdarr 各项置 events = 0、data.fd = MAX_EVENTS + 1 作标记。ChannelSet 用 channel->Events() 填 ev.events,先 epoll_ctl 再写 _channels[fd];Poll 循环 find,未命中 DBG_LOG 后直接 return,命中则 push_back 并 SetRevents(_fdarr[i].events)。

bug1:仅把对象设置到内核,落下设置到成员 _channels 内部,Poll 的 find 遂落空,补 _channels[fd] = channel; 后修复。bug2:测试时忽略成员生命周期,下一轮循环仍使用已销毁的成员,耗 4h;正因 ~Channel 析构才准确定位,属血泪教训。bug3:Poll 内忘记设置 revents;epoll_wait 输出的是所关心 fd 产生的事件回应,事件位须回填,故补 SetRevents,根因是对知识忘记了。

总结

三处 bug 同源:内核与用户两侧状态未同步、对象生命周期、事件回填;分工是 UpdateEvent 判存在、ChannelSet 只写、Poll 只取。

常见问题

  1. bug1 现象?Poll 的 find 落空。
  2. 为何不 close?RemoveEvent 注释:只做分内之事。
  3. bug3 漏哪行?Poll 的 SetRevents。

标签

epoll、Poller、Channel 映射、gdb 调试

【统计:全文约 745 字 / 原代码 133 行 / 比例约 5.6;注释字段小节 4 个 / 成文 bug 3 处】

【上限说明:4 个非 bug 字段加 3 处 bug 并列,5N = 665 无法容纳全部必需板块;已按规则三保留板块、逐句压到最简,未灌水,超出部分即字段要点与三处 bug 本身所占字符。】

相关推荐
·present·3 分钟前
CSAPP(lecture 13_02 Linking)
c语言·c++
andxe29 分钟前
工业级 PoE 交换机选型指南:破解边缘部署四大核心难题
运维·网络·安全·光通信·交换机
旖旎夜光43 分钟前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
Decay__1 小时前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
木子欢儿2 小时前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
迪菲赫尔曼3 小时前
【基础篇 26】第一次在服务器完成训练:准备数据、断线继续、检查成果与备份
运维·服务器·人工智能·机器学习·计算机视觉
进击的荆棘3 小时前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
白杨尚青3 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
.道阻且长.3 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言