在服务器端,在readfds上执行select()时,会返回坏文件描述符错误。我该如何找到在fdset中哪个fd变为无效?
select
返回并标记相应的描述符准备好读取。 当您随后从它们执行read
/recv
时,将返回错误或EOF。strace
工具(如果可用)进行调试。 它将帮助您跟踪哪些描述符被提供给select
,以及使用哪些描述符read
/recv
。int get_socket_error( int s ) {
int error;
socklen_t len = sizeof( error );
if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &error, &len ) < 0 )
error = errno;
return error;
}
但是正如@Maxim所说,从select(2)
返回EBADF
通常表示代码质量较差。
FD_ISSET
等)。一种常见的方法是从0到max_fd + 1
循环,使用FD_ISSET
宏检查描述符是否准备好进行IO操作。您正在迭代的当前变量包含文件描述符。 - Maksim Skurydzinepoll(7)
。这样就不需要在每次迭代中重新填充等待列表了,而且已经被关闭的套接字会自动从轮询集合中删除。 - Nikolai Fetissov
select
返回EBADF
,通常意味着您提供了一个无效的描述符。它无效的原因(不存在的文件描述符、关闭的描述符或发生错误的描述符)应该在之前确定。 - Maksim Skurydzin