В настоящее время я изучаю select () для мультиплексирования ввода-вывода в сетевом программировании. select принимает следующие аргументы:
int select (int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout);
Описание для типа данных fd_set вызова select () имеет следующий вид:
select использует наборы дескрипторов, обычно массив целых чисел, где каждый бит в каждом целом числе соответствует дескриптору. Например, при использовании 32-битных целых чисел первый элемент массива соответствует дескрипторам с 0 по 31, второй элемент массива соответствует дескрипторам с 32 по 63 и так далее.
если это так, то, как я понимаю, если у вас есть дескрипторы 1,4,5 для набора чтения, тогда значение будет установлено как:
LSB MSB
01001100000000000000000000000000 // descriptor bits set corresponding to 1,4,5
0123456........................31 //descriptor bit positions
Биты 0-31 образуют целочисленное значение, равное 50, которое должно быть первым элементом считываемого набора, т.е. [50] в нотации массива, поскольку тип данных fd_set:
typedef struct fd_set {
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
} fd_set;
Но когда я проверил strace -p 2172
, где 2172 - это pid другого терминала, в котором я набрал команду ls
, результат был следующим:
pselect6(1,[0],NULL,NULL,NULL,{[],8})
зачем читать дескриптор, установленный в массиве pselect6: [0], когда дескриптор fd, связанный со стандартным вводом, равен 0, поэтому целочисленное значение становится 1, то есть [1]? Правильно ли я истолковал описание?
Кроме того, что произойдет, если вы установите для чтения, а также набор исключений, и во время вызова для выбора дескрипторы только в наборе для чтения готовы к операции чтения и возвращаются. Однако позже будут готовы дескрипторы для набора исключений, но, поскольку select уже вернул, то что вернет проверка на FD_ISSET (int fd, fd_set * exceptSet)?
Я новичок в сетевом программировании.
strace
отображает набор дескрипторов как массив FD, а не фактические двоичные данные. - person Barmar   schedule 03.02.2018[0]
означает, что набор FD содержит0
. - person Barmar   schedule 03.02.2018strace
не показывает буквальные целочисленные значения, переданные вselect
; он показывает вам список файловых дескрипторов. Например, если вы вызвалиselect()
со стандартным вводом, выводом и ошибкой (FD 0, 1 и 2), он отобразится как[0,1,2]
. - person   schedule 03.02.2018