免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2616 | 回复: 7
打印 上一主题 下一主题

求教:select的返回值是套接字数还是事件数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-04 11:23 |只看该作者 |倒序浏览
看到linux2.4源码里是计算三个集的事件总数返回,我自己写的一个小例子也发现是事件数。

可是,在我一个项目里,当某个套接字同时发生可读和异常时,发现并不计入返回值里。就是我有800多个套接字,分别关注了其读(或写)和异常,某次select发现返回1,但具体FD_ISSET时却只其中一个是可写,其它300多个是可读和异常同时置值。

另外,看lighttpd的源码fdevent_select,也发现它只是认为是发生的句柄数并用它作循环。(当然,它的注释是事件数,矛盾)。

而我自己写的例子又不知道怎么让它异常。。。

有没人也碰到过这种问题?
九片_cu 该用户已被删除
2 [报告]
发表于 2009-12-04 11:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2009-12-04 11:29 |只看该作者
可读写描述符数

论坛徽章:
0
4 [报告]
发表于 2009-12-04 11:33 |只看该作者

回复 #1 vical 的帖子

ETURN VALUE
       On success, select and pselect return the number of  descriptors  con-
       tained  in  the  descriptor  sets
这里是说的在集里的描述符数,就有点不明白了:
如果描述符x同时在可读和异常里,它应该认为返回2还是1?或者是0?
但linux2.4和2.6的源码sys_select----do_select里都是计算三个集的总和。。。

不好意思,实在是因为我不知道怎么让它异常,写的例子都没法确认,所以要再求教。。

另外,unix网络编程里说异常集只会在带外数据和另外一个情况下才有用。这个好象跟我们现在编程使用上都有不同了,有没哪位了解这点呢?

[ 本帖最后由 vical 于 2009-12-4 11:38 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-12-04 11:54 |只看该作者
能否说稍微具体一点点呢?

论坛徽章:
0
6 [报告]
发表于 2009-12-04 12:08 |只看该作者
fd的数量~~ 一个fd可能有多个事件发生~~

论坛徽章:
0
7 [报告]
发表于 2009-12-04 13:21 |只看该作者
个人怀疑你没有正确的使用 select。 select 的第一个参数是 maxfd+1, 对于 maxfd 之外的fd, select 是不做处理的, 并且超出MAXFD的描述符,不应该使用select。通常情况下如果值不是<=0,可以简单的忽略这个返回值。
select 返回值确实是事件的数据, 就是三个fdset被置位的位数目之和。

论坛徽章:
0
8 [报告]
发表于 2009-12-05 15:35 |只看该作者
已经确认不超过1000个,还没达到__FD_SETSIZE 1024.所以不会出现超限问题。也已经确认是maxfd+1了。

目前最烦恼是这两点:
1. lighttpd里实现一定是认为三个集置位的不同FD之和,否则它就实现错了,而LINUX代码是三个集置位之和。我相信NIX代码,所以:
    for (...){
      if (FD_ISSET(fdn->fd, &me->rset)) {
            n--;
            if (FD_ISSET(fdn->fd, &me->save_rset))  re |= POLLER_IN;
        }
        if (FD_ISSET(fdn->fd, &me->wset)) {
            n--;
            if (FD_ISSET(fdn->fd, &me->save_wset))  re |= POLLER_OUT;
        }
        if (FD_ISSET(fdn->fd, &me->eset)) {
            n--;
            if (FD_ISSET(fdn->fd, &me->save_eset))  re |= POLLER_ERR;
        }
    }
   assert(n==0);
    但偶现assert,打日志发现n<0了。

2.怎么让套接字异常呢?这样好在例子里测试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP