Вы можете.
Это повторяет набор без ISSET()
-ing всех FD из массива.Но вы все равно должны коснуться всех long
с в массиве fd_set.__fds_bits
.
#include<sys/select.h>
#include<stdio.h>
int main(void)
{
fd_set fds;
FD_ZERO(&fds);
//Fill the set.
FD_SET(6, &fds);FD_SET(20, &fds);FD_SET(33, &fds);FD_SET(200, &fds);
int i;
unsigned long *m = (unsigned long *)__FDS_BITS(&fds);
int fd=0;
for (i = 0; i < sizeof (fd_set) / sizeof (unsigned long); ++i) //can use int, long or long long. Using long because internal structure is long.
{
fd=sizeof (unsigned long)*i*8;
while(m[i]!=0)
{
fd+=__builtin_ctzl(m[i]); //Get Number of trailing zero bits in long.
printf("FD=%d\n",fd);
/*Found FD*/
m[i]>>=(__builtin_ctzl(m[i]))+1;
++fd;
}
}
return 0;
}
Это прекрасно работает для меня, используя gcc (SUSE Linux) 4.6.2
Фон
в моей системе fd_set выглядит следующим образом (извлечь и упростить /usr/include/sys/select.h
):
typedef struct {
__fd_mask __fds_bits[__FD_SETSIZE/__NFDBITS];
}
с __fd_mask
, являющимся typedef для long int
.
__FD_SETSIZE/__NFDBITS
, похоже, 16
в моей системе.
Таким образом, этот массив составляет (__FD_SETSIZE/__NFDBITS)*sizeof(__fd_mask)*8
битов.
С __NFDBITS = 8*sizeof(__fd_mask)
вы видите, что он содержит __FD_SETSIZE
битов.
Просмотр определенных макросов в /usr/include/bits/select.h
показывает, что __fd_bits
используются для хранения fds.Когда задано значение fd n
, бит nth
в __fd_bits
установлен равным 1.
i386 (среди других ) процессоры имеют одну операцию для подсчета завершающего нулябиты числа.С этим количеством конечных нулей вы можете легко сдвинуть запись __fd_bits
на эту величину + 1, и вы найдете следующий true
бит.
По сравнению с циклическим набором записей вашего fd_set вам нужнокак минимум __FD_SETSIZE/__NFDBITS=16
циклов, когда не выполняется оптимизация с использованием возвращаемого значения select.
Но убедитесь, что ваш процессор и компилятор поддерживают операцию для выбранного типа цикла.Если по умолчанию НЕ используется битовая операция, но сложная реализация, это может ухудшиться.
Если это на самом деле лучше, чем зацикливание, необходимо доказать известные fds.