首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >select()返回1但FD_ISSET(fd)是否为false?

select()返回1但FD_ISSET(fd)是否为false?
EN

Stack Overflow用户
提问于 2015-07-06 23:21:15
回答 1查看 1.1K关注 0票数 0

我遇到了这样一种情况:在传递的集合中,我用一个文件描述符调用select(),在TCP上的C++应用程序中,它返回1,之后不久,在代码中再次调用select(),并且在描述符上返回0FD_ISSET()都是false (不确定哪种情况,我也不能轻松地再现这种罕见的情况)。因此,我想知道,如果在两个调用之间没有从描述符中读取任何内容,那么select()能否从同一个文件描述符上返回10,在这种情况下发生什么情况?如果不是,那么select()是否可以返回1,然而FD_ISSET()false,即使只有一个文件描述符被传递给select(),在这种情况下,发生这种情况会发生什么呢?

EN

回答 1

Stack Overflow用户

发布于 2015-07-07 01:48:09

select()可以修改给它的fd_set项,所以确保每次调用select()时都重置fd_set项。

尽管如此,让我们假设您是在read fd_set参数中传递套接字。第一次调用select()并且套接字是可读的,套接字将保留在fd_set中,select()将返回1。只要套接字保持可读性,select()就会很高兴地将套接字保留在fd_set中。但是,如果select()返回0,这意味着select()超时(套接字在指定的时间框架内不可读),因此select()将从fd_set中删除套接字,FD_ISSET()将为false。因此,需要在下一次调用select()时重置select(),以便将套接字放回fd_set中,以便能够再次测试。

现在,关于套接字/fd_set从可读状态到不可读状态的原因和方式,如果不看到管理套接字和在每个fd_set调用上填充select()的实际代码,就很难回答。我的猜测是,要么您一开始就没有正确地管理它们,要么您有多个线程共享套接字/fd_set并以您意想不到的方式践踏彼此的状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31257304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档