2012-01-01 3 views
21

Мне было интересно, что делает nfds, прочитав разные руководства, я получаю только ответ Это наивысший пронумерованный файловый дескриптор плюс один. Для чего он точно используется?Что такое nfds from select(), используемое для

+3

http://unix.stackexchange.com/questions/7742/whats-the-purpose-of-the-first-argument-to-select-system-call –

ответ

13

Когда вы используете 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().

+1

Из имени 'nfds' (* количество файлов дескрипторы *) Я бы ожидал '7', когда я хочу контролировать число fd' 24' до '31'. Почему '32'? (Я знаю, что вы правы, страница руководства говорит об этом тоже, но мне интересно, почему) – hek2mgl

+0

@ hek2mgl: Это потому, что набор начинается с дескриптора файла 0; в интерфейсе нет способа указать другую отправную точку. Это может замедлить работу, если вы используете 'select()' на сервере с тысячами дескрипторов открытых файлов. –

+2

Вниз: даже если ответ (в основном) правильный, он пропускает важные детали и формулируется таким образом, который невозможно понять. Вместо этого см. Http://unix.stackexchange.com/questions/7742/whats-the-purpose-of-the-first-argument-to-select-system-call. – marcv81

Смежные вопросы