Как использовать функцию select() в программировании сокетов?

StackOverflow https://stackoverflow.com/questions/851759

  •  21-08-2019
  •  | 
  •  

Вопрос

Прототип:

int select (int nfds,
            fd_set *read-fds,
            fd_set *write-fds,
            fd_set *except-fds,
            struct timeval *timeout);

Я довольно долго пытался понять эту функцию.Мой вопрос: если он проверяет все файловые дескрипторы от 0 до nfds-1 и при возврате изменяет read-fds, write-fds и кроме-fds, почему мне нужно использовать FD_SET для добавления файловых дескрипторов в набор в начале он все равно проверит все файловые дескрипторы или нет?

Это было полезно?

Решение

Он не будет проверять от 0 до nfds-1.Первый аргумент просто предоставляет верхнюю границу размера используемых файловых дескрипторов.Это связано с тем, что сам набор может быть представлен как битовый вектор, без возможности узнать, сколько бит на самом деле используется.Указание этого в качестве отдельного аргумента помогает select() избегайте проверки файловых дескрипторов, которые не используются.

Кроме того, дескриптор, которого нет, например.чтение установлено при вызове select() вообще не проверяется, поэтому он не может появиться в наборе и при возврате вызова.

Другие советы

Когда-то у меня было такое же сомнение, как и у тебя.Вы можете посмотреть следующие вопросы и ответы:

Запрос при выборе системного вызова

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top