打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[kernel] epoll在ET模式下“带出EPOLLOUT”的疑问 ? 爱开源
几个月前朱照远同学向我提过一个epoll的疑似bug:
1. 创建一个socket(sfd)并connect到某个server
2. 创建 epoll_create(efd)
3. 将socket的描述符sfd加入efd,  采用ET模式
4. 调用epoll_wait将返回一个EPOLLOUT事件(因为连接成功了)
以上是正常的,但是,此时如果从server来了一个消息, epoll_wait将会返回一个event,这个event包含了EPOLLIN和EPOLLOUT
“照理说”,既然采用了ET模式,EPOLLOUT上次已经出现了,不应该再出现,但是它被EPOLLIN事件给“带出来”了
这看上去似乎像个问题,但似乎也可以理解为epoll的一个特性,所以,保险起见,我发了个邮件给 linux-api 和 linux-netdev 说明了一下这个事儿,希望能得到权威回答。
不久就有两位回邮件了,其中一位是 Eric Dumazet(从git log里看,他提交了很多kernel network方面的patch,应该是很有发言权的),说得很明白:
“Its not true. Same “status” can be delivered several time.
Think about Edge and Level trigger. An event (change of status) is the
trigger.
As soon as on trigger is done, epoll delivers a status.
And your file status is indeed EPOLLOUT | EPOLLIN, since you can read or
write on it.
….
Not a bug, but a misinterpretation of what is an event and what is a
status.?”
原文http://www.spinics.net/lists/linux-api/msg01871.html
看来正确的理解是:ET模式只保证在边缘条件出现时(上面的例子是从不可读变为可读)从epoll_wait里返回,但不保证fd的event里只有“从不可读变为可读”带来的EPOLLIN。毕竟epoll_wait返回的event是指fd的“状态”,既然这个fd可写可读,那么包含EPOLLIN和EPOLLOUT就不能被认为是有错。
相关日志
CLSF讨论会纪要(二)
CLSF讨论会纪要(一)
编译适合服务器的linux内核
分布式文件系统FastDFS设计原理及技术架构
Linux kernel AIO这个奇葩
ext3 readonly filesystem
ext4的“打洞”功能(punch hole)
搭建内核开发调试环境
Linux 2.6.36内核优化指南
编译 RedHat 定制的内核 rpm 包
tcp_tw_recycle和tcp_timestamps导致connect失败问题
kgdb调试内核模块
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
简述Linux Epoll ET模式EPOLLOUT和EPOLLIN触发时刻
epoll 事件的检测
【2019-11-07】twemproxy事件--by 闫昌
python下使用epoll
Linux服务器网络编程之epoll的实现原理
linux下epoll模型accept并发问题 ? 搜索技术博客-淘宝
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服