首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

select实施正常,为什么有时FD_ISSET却判断失败

2012-08-01 
select执行正常,为什么有时FD_ISSET却判断失败问题是这样的,select执行后,有时FD_ISSET却判断失败,但大部

select执行正常,为什么有时FD_ISSET却判断失败
问题是这样的,select执行后,有时FD_ISSET却判断失败,但大部分的时候都是判断正常的,判断失败的情况大概执行100次会出现6次,但是现在不允许FD_ISSET判断失败,我想问下,标题所示的这种情况是在什么条件下发生的。
下面是相关源码:

C/C++ code
int recv_data(int sockfd){    fd_set r_set;    while(1)    {        FD_ZERO(&r_set);        FD_SET(sockfd, &r_set);        if(select(sockfd + 1, &r_set, NULL, NULL, NULL) == -1)            err_sys("select error \n");        // 当我描述的问题出现时,可以执行到这里,可是下面有时判断失败        if(FD_ISSET(sockfd, &r_set))        {            // do something        }    }    return 1;}


我的环境是Linux。。。。。。

[解决办法]
原因是:
有时select会超时退出,返回0,这种情况下r_set会被清零。所以FD_ISSET失败。

因此:
你加上对select返回0的处理就可以了。
[解决办法]
你的代码逻辑告诉我,无论select返回什么,你都会去判断FD_ISSET, 这怎么会合理呢。

热点排行