有没有办法测试 fd_set 是否为 "nonzero"?
Is there a way to test if a fd_set is "nonzero"?
是否存在测试条件的函数"are any bits set in a fd_set"?
如果可能的话,我想测试 any 位是否设置在 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()
}
...
即为了响应 select()
解锁,我想分别处理四种情况:
1)读取的fds中是否设置了特定的fd
2)read fds中是否设置了除特定read fd以外的fd
3)写fds时是否设置了特定的fd
4)write fds中是否设置了除特定write fds以外的fd
是否有提供这种 "is any fd in this fds set?" 功能的现有函数?或者是在循环中使用 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;
...
除了特定的“FD_IS_ANY_SET()
”函数之外,我对解决此问题的替代方法持开放态度 - 我对 select()
不是很有经验。
以下是测试 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;
}
函数FD_IS_ANY_SET
returns true
如果*fdset
包含至少一个文件描述符,否则false
.
是否存在测试条件的函数"are any bits set in a fd_set"?
如果可能的话,我想测试 any 位是否设置在 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()
}
...
即为了响应 select()
解锁,我想分别处理四种情况:
1)读取的fds中是否设置了特定的fd
2)read fds中是否设置了除特定read fd以外的fd
3)写fds时是否设置了特定的fd
4)write fds中是否设置了除特定write fds以外的fd
是否有提供这种 "is any fd in this fds set?" 功能的现有函数?或者是在循环中使用 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;
...
除了特定的“FD_IS_ANY_SET()
”函数之外,我对解决此问题的替代方法持开放态度 - 我对 select()
不是很有经验。
以下是测试 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;
}
函数FD_IS_ANY_SET
returns true
如果*fdset
包含至少一个文件描述符,否则false
.