Мне было интересно, что делает nfds
, после чтения разных руководств, я получаю единственный ответ, являющийся наивысшим номером дескриптора файла плюс один. Для чего он используется?
Что такое nfds из select(), используемого для
Ответ 1
Когда вы используете select()
, вы пытаетесь проверить состояние набора файловых дескрипторов. Возможный диапазон файловых дескрипторов, которые вас интересуют, варьируется от низкого значения 0 (стандартный ввод) до некоторого максимального значения (самый высокий файловый дескриптор, который вы открыли, который вас интересует при проверке состояния). Вы должны сказать select()
, насколько велик список дескрипторов файлов, потому что общее число может быть "огромным" (например, 32767). В этом случае требуется, чтобы ядро обработало дескрипторы, плюс вы не могли инициализировать fd_set
до этого количества записей. FD_SETSIZE
также фигурирует в уравнении, но иногда вы можете изменить это значение.
Итак, если вы хотите контролировать файловые дескрипторы 24-31, вы должны установить nfds
в 32 и убедиться, что используете FD_ZERO()
для нулевого значения целых fd_set
и FD_SET()
для установки записей 24- 31. Также обратите внимание, что select()
изменяет входные параметры, поэтому вам нужно использовать FD_ISSET()
для тестирования после возврата select()
, и в общем случае вам нужно повторить инициализацию (или скопировать сохраненное значение) в fd_set
перед вызовом select()
снова.