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

Прототип:

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


person gc .    schedule 12.05.2009    source источник
comment
Это тот самый select, который был сломан? :)   -  person mmx    schedule 12.05.2009


Ответы (2)


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

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

person unwind    schedule 12.05.2009

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

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

person Prabhu. S    schedule 12.05.2009