我遇到了一个情况,我在传递的集合中使用单个文件描述符调用select()
,在TCP套接字上的C ++应用程序中,它返回1
,很快就在代码,select()
再次被调用,并且它在描述符上返回0
或FD_ISSET()
为false
(不确定哪个,我不能轻易地重现这种罕见的情况)。因此,我想知道,如果从两个调用之间的描述符中没有读取任何内容,select()
可以从同一个文件描述符上的1
返回0
,在这种情况下是什么发生这种情况时会怎样?或者如果没有,那么即使只有一个文件描述符传递给select()
,1
可以返回FD_ISSET()
,false
仍然是select()
,在这种情况下,当发生这种情况时会发生什么?
答案 0 :(得分:0)
select()
可以修改您提供的fd_set
项,因此请务必每次重新设置fd_set
项 {{1} }。
话虽如此,我们假设您正在 read fd_set参数中传递套接字。第一次调用select()
并且套接字是可读的,套接字将保留在select()
中,fd_set
将返回1.只要套接字仍然可读,{{1}我很乐意将套接字保留在select()
中。但是,如果select()
返回0,则表示fd_set
超时(套接字在指定的时间范围内无法读取),因此select()
将从select()
中删除套接字而select()
将是假的。因此,需要在下次调用fd_set
时重置FD_ISSET()
,以便将套接字放回fd_set
,以便可以再次测试。
现在,关于socket / fd_set为什么以及如何从可读状态进入不可读状态,如果没有看到管理套接字并填充select()
的实际代码,很难回答在每个fd_set
电话上。我的猜测是你要么没有正确地管理它们,要么你有多个线程共享socket / fd_set并以你不期望的方式践踏彼此的状态。