测试环境:
CentOS release 6.2 (Final)
测试用例一: ET模式下,EPOLLOUT事件的触发
setup1 事件注册:
epoll_ctl( epfd, connfd, EPOLLIN|EPOLLOUT|EPOLLET )
setup2 触发:
telnet 连接后,发送两次消息
测试结果:
epoll_wait wake up events number:1=========================================================================[4]
EPOLLIN
EPOLLOUT
recv msg:[kkkkkkkkk
]
ignore poll out event
all events process complate================================================================================[4]
epoll_wait wake up events number:1=========================================================================[5]
EPOLLIN
EPOLLOUT
recv msg:[k
]
ignore poll out event
all events process complate================================================================================[5]
epoll收到两次事件,每个事件均收到 EPOLLIN和EPOLLOUT,如果socket可写,则该事件会伴随其他事件出现。
epoll的工作模式应该是:当相关的对象(本例为sock)状态发生变化时(比如由可读触发的变化),epoll会报告该对象的所有的监控状态(由可读引发的状态变化,除了报告可读状态外,还会报告可写状态)
测试用例二:收到EPOLLOUT事件后,写入数据,但是并不填满发送缓冲区,EPOLLOUT事件再次时如何触发的
setup1 事件注册:
epoll_ctl( epfd, connfd, EPOLLIN|EPOLLOUT|EPOLLET )
setup2 连接:
telnet connect(连接建立后,EPOLLOUT 触发 )
setup3: 发送数据
在初次EPOLLOUT中仅写入10字节长度数据,并且write没有返回-1
结果:
telnet 收到10字节数据,EPOLLOUT 并没有触发,说明:写缓冲区有没有经历一个由空到满,在由满到空的过程,EPOLLOUT事件是不会触发的。(在这个过程中,socket对象的写状态一直时可写的,并没有状态变化,所以不会触发EPOLLOUT事件)
替换 setup3 为setup 4:
setup 4:发送数据
在初次EPOLLOUT中持续写入数据,并且write返回-1,errno == EAGAIN
结果:
在初次epollout事件中,在写入total:14130数据后,write返回-1并且 errno == EAGIN。稍后又收到了 EPOLLOUT事件。
测试用例三-1:通过epoll_ctl MOD 触发EPOLLOUT
setup 1:创建线程
线程中每五秒调用 epoll_ctl( MOD, event |= EPOLLOUT )打开 EPOLLOUT事件
setup2:EPOLLOUT事件处理
(可选)调用write()写入10字节数据(仅写入10字节是避免写缓冲区被写满)
调用 epoll_ctl( MOD, event &= (~EPOLLOUT) )关闭 EPOLLOUT事件
测试结果:
每次线程打开EPOLLOUT事件后,该socket对象上的EPOLLOUT事件都会被触发
测试用例三-2:通过epoll_ctl MOD触发EPOLLOUT
setup 1:创建线程
线程中每五秒调用 epoll_ctl( MOD, event |= EPOLLOUT )打开 EPOLLOUT事件
setup2:EPOLLOUT事件处理
不做任何处理,直接返回(导致针对EPOLLOUT仅仅有打开,而没有关闭)
测试结果:
每次线程打开EPOLLOUT事件后,该socket对象上的EPOLLOUT事件都会被触发
测试用例三-3:通过多线程 epoll_ctl MOD 触发EPOLLOUT
多线程重复上述两个测试,EPOLLOUT事件的触发不受多线程的影响(即同一时刻有多个线程打开EPOLLOUT,EPOLLOUT仅仅触发一次)
Q7 If more than one event occurs between epoll_wait(2) calls, are they combined or reported separately?
A7 They will be combined.