在用一个FD调用`select`之后是否需要调用`FD_SET`?

时间:2015-05-26 19:21:06

标签: c++ linux

//int fd <= socket fd
timeval tv;
tv.tv_sec  = 100;
tv.tv_usec = 0;

fd_set readfds;
FD_ZERO( &readfds );

FD_SET( fd, &readfds );
const int iRes = select( fd + 1, &readfds, NULL, NULL, &tv );

if (iRes > 0)
{
    if (FD_ISSET( fd, &readfds )
    {
        // read from fd            
    }        
} else {
    // 0: timeout
    // -1: error in select
}

问题:在我从fd读取之前,我是否必须在上面的代码中使用FD_ISSET? 根据我的理解,在读集中只有一个fd,返回值大于0,那么传递的fd应该始终在readfds

1 个答案:

答案 0 :(得分:2)

如果FD_SET的返回值与所有输入{{1}中设置的FD的总数相同,则不需要致电select() }}秒。如果您只使用一个fd_set来调用它,它只有一个FD集,并且fd_set返回select只是一个特殊情况。