免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wyezl

epoll模型的使用及其描述符耗尽问题的探讨 [复制链接]

论坛徽章:
0
发表于 2008-10-06 13:06 |显示全部楼层
原帖由 wyezl 于 2007-2-27 09:45 发表
我把返回值不大于0 的情况,都关闭了。
而且显式执行了 epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, &ev);

尽管如此,问题还是有的。

所以必须设置一个超时监控线程来解决。



tcp connection是可能断开而不触发任何事件的,这种情况在internet上要比在局域网里面常见得多。这可能也是为什么你用测试工具测试都ok,而上线就会有问题。

tcp connection你可以看作是两个村子之间有条山路,这条山路到底通还是不通,你必须派信使实际走一趟才知道。如果没有信使到来,你就不知道这条路通不通,也许发生山崩了呢。(信使就相当于网线上的高低电平信号)

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2008-10-06 14:53 |显示全部楼层
原帖由 精简指令 于 2006-8-27 16:48 发表
我又按照下面步骤测试了一下

第一次:
1、epoll 在一个文件描述符上,等待一个EPOLLIN事件。
2、epoll 在这个文件描述符上被唤醒,然后只接收部分数据。(没有等到EAGAIN)
3、继续等待这个EPOLLIN事件。 ...


“第二次:
1、epoll 在一个文件描述符上,等待一个EPOLLIN事件。
2、epoll 在这个文件描述符上被唤醒,然后只接收部分数据。(没有等到EAGAIN)
3、继续等待这个EPOLLIN事件。
4、epoll 没有再被唤醒。
5、再次收到新数据后,epoll又在这个描述符上被唤醒了。

正常现象。”

这个有问题吧。再次收到新数据,epoll 应该没有再被唤醒才对。因为文件描述符状态并没有改变,仍然是就绪状态

论坛徽章:
0
发表于 2008-10-06 15:39 |显示全部楼层
原帖由 wyezl 于 2006-8-18 11:23 发表
只要能帮我找出描述符从哪耗尽的就行。
:)



您老的程序有很多TIMEWAIT吧? shutdown(fd, SHUT_RDWR); 了么?

论坛徽章:
0
发表于 2008-10-06 19:52 |显示全部楼层
这个帖子有些年代了,不知道你们怎么翻出来了
对于楼主这个问题,我觉得会不会可能是accept太快,而且每次epoll_wait满足io的fd要大于EVENTSIZE这样慢慢积累到最后就满足Io条件但又得不到处理的fd越来越多,最终导致fd用完。

论坛徽章:
0
发表于 2008-10-07 03:10 |显示全部楼层
好 啊帮丁了

论坛徽章:
0
发表于 2008-10-08 15:05 |显示全部楼层
我曾碰到跟楼主类似的问题,正好学习一下。。。。

论坛徽章:
0
发表于 2009-02-26 23:17 |显示全部楼层
原帖由 wyezl 于 2006-8-28 11:19 发表
int my_read(int fd,void *buffer,int length)
{
        int bytes_left;
        int bytes_read;
        char *ptr;
        ptr=buffer;
        bytes_left=length;
        while(bytes_left>0)
...


在这个函数里面读到0的地方,表示对方已经主动关闭

挖坟..

论坛徽章:
0
发表于 2009-11-12 10:37 |显示全部楼层
讨论真好,学习之!

论坛徽章:
0
发表于 2010-03-23 15:58 |显示全部楼层
LZ的程序用了多线程,不使用锁同步全局变量不会出问题吗?

论坛徽章:
0
发表于 2010-03-23 17:14 |显示全部楼层
还是没完全解决。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP