Функция 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
?
1) Она блокируется, но длительность блокировки можно задать таймаутом. Если таймаут 0, то она в любом случае вернется сразу после выполнения проверок.
2) Изначально подразумевалось, что дескрипторы являются просто чиселками в интервале от 0 до некоторого максимума. А структура fd_set
содержит массив битовых флагов которые могут быть проиндексированы этими чеселками. Такой подход позволял компактно представлять перечень обрабатываемых дескрипторов. Например, если максимум 1000, то потребуется всего 1000/8 = 125 байт и никакого динамического выделения памяти или сортировки. Если дескриптор 5, то пятый бит в первом байте будет выставлен в 1. Соответственно функция будет следить только за теми дескрипторами, соответствующий бит которых равен 1.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Стоит задача смоделировать очередь банкаПоискал различную инфу в интернете и остановился на книге Каррано
Здравствуйте при работе с СУБД MySQL возникла проблема с кодировкой русских символовВ базе данных все корректно отображаетсяи и в Java приложении...
Пытаюсь получить данные методом getInfo вот из этого API https://yobitnet/ru/api/
ЗдравствуйтеУстановил идею и возникла проблема не могу создать класс никакой - выходит сообщение -