epoll 模型测试

测试环境:

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.

转载于:https://www.cnblogs.com/rushoutasia/p/5859894.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值