几个月前朱照远同学向我提过一个epoll的疑似bug:1. 创建一个socket(sfd)并connect到某个server2. 创建 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 thetrigger.As soon as on trigger is done, epoll delivers a status.And your file status is indeed EPOLLOUT | EPOLLIN, since you can read orwrite on it.….Not a bug, but a misinterpretation of what is an event and what is astatus.?”原文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 filesystemext4的“打洞”功能(punch hole)搭建内核开发调试环境Linux 2.6.36内核优化指南编译 RedHat 定制的内核 rpm 包tcp_tw_recycle和tcp_timestamps导致connect失败问题kgdb调试内核模块