有没有办法测试 fd_set 是否为“非零”?

Sto*_*row 5 c linux select file-descriptor

是否有现有函数来测试条件“fd_set 中是否设置了任何位”?

如果可能,我想测试是否在 fd_set 中设置了任何位,而不是测试是否设置了特定的fd,使用FD_ISSET(). 我正在尝试按照(伪代码)的方式编写代码:

...
select( max_fd + 1, &readfds, &writefds, NULL, NULL );
if ( FD_ISSET( specific_read_fd, &readfds ) )
{
  handleSpecificReadFdSet();
}
else if ( FD_IS_ANY_SET( &readfds ) ) // Desired functionality
{
  handleOtherReadFdSet();
}
else if ( FD_ISSET( specific_write_fd, &writefds ) )
{
  handleSpecificWriteFdSet();
}
else // if ( FD_IS_ANY_SET( &writefds ) )
{
  handleOtherWriteFdSet()
}
...
Run Code Online (Sandbox Code Playgroud)

即响应select()变得畅通无阻,我想分别处理四个条件:

1) read fds中是否设置了特定的fd

2) read fds中是否设置了除特定read fd以外的任何fd

3) write fds中是否设置了特定的fd

4) write fds中是否设置了除特定write fds以外的任何fd

是否有一个现有的函数提供这样的“在这个 fds 集中是否有任何 fd?” 功能?或者是在循环中使用 FD_ISSET 的唯一方法,例如:

...
bool ret_val = false;
for ( int i = 0; i < max_fd; ++i )
{
  if ( i == specific_read_fd ) continue;
  if ( FD_ISSET( i, &readfds ) ) { ret_val = true; break; }
}
return ret_val;
...
Run Code Online (Sandbox Code Playgroud)

除了专门的“ FD_IS_ANY_SET()”功能之外,我对解决此问题的替代方案持开放态度- 我对select().

小智 5

以下是测试 fd_set 是否为空的方法:

bool FD_IS_ANY_SET(fd_set const *fdset)
{
    static fd_set empty;     // initialized to 0 -> empty
    return memcmp(fdset, &empty, sizeof(fd_set)) != 0;
}
Run Code Online (Sandbox Code Playgroud)

如果包含至少一个文件描述符,则该函数FD_IS_ANY_SET返回,否则返回。true*fdsetfalse