LINUX.ORG.RU

Зачем нужен (первый) параметр nfds вызова posix select (2)?

 ,


0

1

man select(2):

int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);


Никак не могу понять параметр nfds. Подскажите пожалуйста:
1. Чем заполняется.
2. Зачем это нужно.

Судя по имени предположил что это число дескрипторов (nfds - Number of File DescriptorS), но в руководстве вообще что-то странное написано...

★★★

Последнее исправление: normann (всего исправлений: 1)

Не знаешь что в терминале ман можно прокрутить дальше четырёх начальных строк?

anonymous
()

1. highest fd value + 1

2. сообщить селекту диапазон значений fd, который нужно проверять. такая причуда.

anonymous
()
Ответ на: комментарий от anonymous

epoll же, он разрабатывался именно с целью замены select/poll, как более эффективный. Ну и апи у него не такое наркоманское.

hippi90 ★★★★★
()
Ответ на: комментарий от kawaii_neko

poll
libev
libevent
libuv

А аргументировать можно? Это не подкол, а для общего развития. Насколько я понимаю, poll - это тот же select, но чуть-чуть другой, а остальное - просто надстройки над ними.

aureliano15 ★★
()
Ответ на: комментарий от anonymous

1. highest fd value + 1

То же самое что в руководстве, неинформативно.

2. сообщить селекту диапазон значений fd, который нужно проверять. такая причуда.

Зачем?

normann ★★★
() автор топика
Последнее исправление: normann (всего исправлений: 1)
Ответ на: комментарий от anonymous

уметь пользоваться select надо,полезно, это универсальный апи колл на всех ОС присутствует, дальше по мере опыта и потребностей можно расширять свой кругозор

anonymous
()
Ответ на: комментарий от normann

Чтобы ядро знало, сколько памяти можно читать и писать по следующим указателям.

FD_SETSIZE и тип fd_set не связаны с ядром, а используются только стандартной библиотекой.

vzzo ★★★
()
Последнее исправление: vzzo (всего исправлений: 2)
Ответ на: комментарий от vzzo

На деле советчики выше правы: select() не заслуживает изучения и должен быть на свалке истории. Если хочется низкоуровневого, поиграй с epoll но с EPOLLET, если относительно высокоуровнего — с lib?v/libevent или asio/Qt.

vzzo ★★★
()
Ответ на: комментарий от anonymous

а зачем на ЛОРе портируемая хрень? epoll - отличное средство.

Iron_Bug ★★★★★
()
Ответ на: комментарий от vzzo

Почему select, имея в своем распоряжении все fd_setы, не может сам заглянуть в них и узнать что, сколько и почем, зачем было так усложнять интерфейс?

normann ★★★
() автор топика
Ответ на: комментарий от aureliano15

Насколько я понимаю, poll - это тот же select

Ты неправильно понимаешь. 1) у poll нет ограничения на 1024 дескриптора. 2) poll гоняет больше данных между ядром и userspace, начиная с некоторого порога (sizeof(FD_SET)/sizeof(struct pollfd))

А остальное, юный друг, надстройки над нормальными механизмами вроде epoll и kqueue (а где-то даже iocp поддерживается), но способные работать и поверх унылого говна вроде select/poll.

Единственный плюс select-а — он есть в WSA2.

kawaii_neko ★★★★
()
Ответ на: комментарий от kawaii_neko

1) у poll нет ограничения на 1024 дескриптора. 2) poll гоняет больше данных между ядром и userspace

спасибо за инфу.

aureliano15 ★★
()
Ответ на: комментарий от normann

Потому что fd_set на самом деле это просто битовая маска из FD_SETSIZE / 8 байт. Имея только указатель на fd_set невозможно узнать максимальное количество байт в этой битовой маске. Почти аналогичная структура данных в C++ это std::bitset<FD_SETSIZE>.

vzzo ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.