Недопонимание с функцией select()

169
13 марта 2018, 02:57

Функция select() выглядит следующим образом

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

и у меня по ней возникает несколько вопросов:

1) Мне как-то смутно представляется, как она работает. Поправьте меня, если я неправ. Допустим, перед вызовом данной функции мы "вызвали" макрос

void FD_ZERO(fd_set *set);

чтобы не было мусора и макрос

void FD_SET(int fd, fd_set *set);

чтобы указать дескрипторы, которые нас интерессуют. После чего вызываем саму функцию и она блокируется до тех пор, пока один из наших дескрипторов не будет готов к чтению или записи (в зависимости от того, что мы указали при помощи макросов) или пока таймер не истечет, или пока не произойдет "исключительная ситуация". Так вот собственно вопрос - функция блокируется или нет? Если не сложно, то объясните, пожалуйста, принцип действия функции.

2) Первый аргумент нашей функции представляет из себя целое число, на единицу большее максимального файлового дескриптора в любом из наборов. Скажите, пожалуйста, если мне интересен только один дескриптор - 5, который я установил с помощью макроса FD_SET(), то функция прервется или нет, если я в дескрипторе 0 что нибудь напишу (и нажму enter)? В общем, мне не понятно, функция будет "следить" только за дескриптором 5 или за всеми от 0 до 5?

Answer 1

1) Она блокируется, но длительность блокировки можно задать таймаутом. Если таймаут 0, то она в любом случае вернется сразу после выполнения проверок.

2) Изначально подразумевалось, что дескрипторы являются просто чиселками в интервале от 0 до некоторого максимума. А структура fd_set содержит массив битовых флагов которые могут быть проиндексированы этими чеселками. Такой подход позволял компактно представлять перечень обрабатываемых дескрипторов. Например, если максимум 1000, то потребуется всего 1000/8 = 125 байт и никакого динамического выделения памяти или сортировки. Если дескриптор 5, то пятый бит в первом байте будет выставлен в 1. Соответственно функция будет следить только за теми дескрипторами, соответствующий бит которых равен 1.

READ ALSO
Создание очереди банка

Создание очереди банка

Стоит задача смоделировать очередь банкаПоискал различную инфу в интернете и остановился на книге Каррано

153
Проблема с кодировкой при работе с СУБД MySQL(Java JDBC)

Проблема с кодировкой при работе с СУБД MySQL(Java JDBC)

Здравствуйте при работе с СУБД MySQL возникла проблема с кодировкой русских символовВ базе данных все корректно отображаетсяи и в Java приложении...

170
Как закодировать запрос к API Yobit.net в HMAC_SHA512

Как закодировать запрос к API Yobit.net в HMAC_SHA512

Пытаюсь получить данные методом getInfo вот из этого API https://yobitnet/ru/api/

183
Не создается класс в IDEA?

Не создается класс в IDEA?

ЗдравствуйтеУстановил идею и возникла проблема не могу создать класс никакой - выходит сообщение -

121