epoll的EPOLLET模式下的事件触发问题

立秋雨 2007-01-31 12:41:35
我在2.6.9-34.ELsmp的内核上使用epoll
每个连接注册了POLLIN POLLOUT POLLET
这时候,每次收到信息,都会触发POLLIN,这是正常的,但是顺带还会触发POLLOUT这个好像就不正常了。

按照某些文档的解释,POLLET模式下,必须等某个操作返回EAGAIN或者EWOULDBLOCK才会收到这个事件。 但是为什么POLLOUT事件会跟着POLLIN一起触发呢。

不知道有没有人遇到这种情况,有什么解决方法,请高手指教。
...全文
1937 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
那个epoll_wait(epfd,events,maxevents,timeout)其中maxevents函数设置了事件返回的最大数目。

想问一下,如果一下子请求的事件数量超过了maxevents怎么办呢?
ws023 2008-10-27
  • 打赏
  • 举报
回复
epoll 端口可读和可写有些不同。可读:从不可读触发到可读,然后就可以读数据出来。
可写:从可写到不可写是不会触发的,再从不可写到可写才会触发。
也就说端口正常情况下都是可写的,只有当你发现返回写入的字符少于你指定的字符个数或者返回错误,才说明这个端口暂时不可写(网卡写缓冲满了之类的),此时你就要设置这个端口可写触发。当再次可写的时候,你就把上次没写完的数据写进去。
daidodo 2008-10-27
  • 打赏
  • 举报
回复
lz需要了解ET工作模式,即所谓的边缘触发:当fd的状态发生改变的时候,才触发相应的事件。
EPOLLIN:当fd从不可读变成可读时,触发事件。如果fd一直可读,即使有新数据到来,也不会触发这个事件。
EPOLLOUT:当fd从不可写变成可写时,触发事件。如果fd一直可写,写入新数据不会触发这个事件。

所以,一个fd不应该刚开始就设置EPOLLOUT,因为这样会马上触发可写事件。
ws023 2008-02-29
  • 打赏
  • 举报
回复
每个连接注册了POLLIN POLLOUT POLLET
这时候,每次收到信息,都会触发POLLIN,这是正常的,但是顺带还会触发POLLOUT这个好像就不正常了。

对 POLLOUT 不应该一开始就注册,应该是注册为 POLLIN 操作以后,对tcp/ip 服务器直接 POLLOUT 不行。
else if(events[i].events&EPOLLIN)

{

if ( (sockfd = events[i].data.fd) < 0) continue;

if ( (n = read(sockfd, line, MAXLINE)) < 0) {

if (errno == ECONNRESET) {


close(sockfd);

events[i].data.fd = -1;

} else

std::cout<<"readline error"<<std::endl;

} else if (n == 0) {

close(sockfd);

events[i].data.fd = -1;

}

//设置用于写操作的文件描述符

ev.data.fd=sockfd;

//设置用于注测的写操作事件

ev.events=EPOLLOUT|EPOLLET;

//修改sockfd上要处理的事件为EPOLLOUT

epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);

}

redex 2007-06-22
  • 打赏
  • 举报
回复
POLLOUT 应该是socket可写吧, 你既然注册了这个事件,socket可写是很正常的.
Roger_long 2007-03-26
  • 打赏
  • 举报
回复
对通信编程熟悉吗?我们公司现在正在大力发展期,需要你这样的人。
可与我联系:MSN : lxp8@sina.com
www.ipark.cn

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧