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