我遇到了这样一种情况:在传递的集合中,我用一个文件描述符调用select(),在TCP上的C++应用程序中,它返回1,之后不久,在代码中再次调用select(),并且在描述符上返回0或FD_ISSET()都是false (不确定哪种情况,我也不能轻松地再现这种罕见的情况)。因此,我想知道,如果在两个调用之间没有从描述符中读取任何内容,那么select()能否从同一个文件描述符上返回1到0,在这种情况下发生什么情况?如果不是,那么select()是否可以返回1,然而FD_ISSET()是false,即使只有一个文件描述符被传递给select(),在这种情况下,发生这种情况会发生什么呢?
发布于 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并以您意想不到的方式践踏彼此的状态。
https://stackoverflow.com/questions/31257304
复制相似问题