Как использовать функцию select () в программировании сокетов? - PullRequest
2 голосов
/ 12 мая 2009

Прототип:

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 и exception-fds при возврате, зачем мне использовать FD_SET для добавления файловых дескрипторов в набор в начале он все равно проверит все файловые дескрипторы, или нет?

Ответы [ 2 ]

2 голосов
/ 12 мая 2009

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

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

0 голосов
/ 12 мая 2009

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

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

...