#c #networking
Вопрос:
Я в замешательстве относительно того, как работает функция выбора. До сих пор я думал, что он просто проверяет все сокеты, которые были установлены в структуре fd_set, которые мы предоставляем в качестве аргументов. Но при чтении о функции отсюда https://pubs.opengroup.org/onlinepubs/7908799/xsh/select.html#:~:text=The select() function tests,descriptors are ready to read.
Аргумент nfds указывает диапазон тестируемых файловых дескрипторов. Функция select() проверяет файловые дескрипторы в диапазоне от 0 до nfds-1.
Это говорит о том, что проверяются все дескрипторы сокетов, даже те, которых даже нет в списке. Может кто-нибудь подтвердить, так ли это работает?
Комментарии:
1. Со
man
страницы: Аргумент nfds указывает диапазон проверяемых дескрипторов. В каждом наборе должны быть проверены первые дескрипторы nfds ; то есть должны быть проверены дескрипторы от нуля до nfds-1 в наборах дескрипторов.2.
This suggests that all the socket descriptors are checked, even those which are not even in the list.
Это не имеет значения. Это зависит от реализации (ядра), чтобы решить, что проверять. Но контракт с вызывающим абонентом заключается в том, чтобы «сообщать только о fds в диапазоне 0 .. nfds-1».
Ответ №1:
nfds
Аргумент действует как верхняя граница проверяемых файловых дескрипторов. На самом деле функция проверяет не все файловые дескрипторы в этом диапазоне, а только те, которые перечислены в одном из fd_set
параметров.
На самом деле FD_SETSIZE-1
для этого параметра обычно используется FD_SETSIZE
макрос, который определяет ограничение на номера файловых дескрипторов, которые select
будут приниматься.
Комментарии:
1.так что на самом деле это _обычно использовать
FD_SETSIZE-1
, что я не видел его за три десятилетия программирования в Unix, и я рад, что мне не пришлось задаваться вопросом, почему человек, который использовал его, без необходимости исключилfd_set
из использования самый высокий член с номером.