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

时间:2017-10-16 21:26:49

标签: c linux select file-descriptor

是否存在测试条件的现有函数"是否在fd_set中设置了任何位"?

如果可能,我想测试是否在fd_set中设置任何位,而不是测试是否设置了特定 fd,{ {1}}。我试图按照(伪代码)编写代码:

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() } ... 取消阻止,我想要针对四个条件单独处理:

1)是否在读取fds中设置了特定的fd

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

3)是否在写入fds中设置了特定的fd

4)在写入fds

中是否设置了除特定写入fds之外的任何fd

是否存在提供此类"的现有函数是此fds集中的任何fd?"功能?或者是在循环中使用FD_ISSET的唯一方法,例如:

select()

除了特别是&#34; ... 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; ... &#34;我还可以解决这个问题。功能 - 我对FD_IS_ANY_SET()没有超级经验。

1 个答案:

答案 0 :(得分:2)

以下是测试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包含至少一个文件描述符,则函数true返回*fdset,否则返回false