Все дистанционно современные системы имеют poll
, и этот интерфейс значительно превосходит select
/ pselect
практически во всех отношениях:
poll
позволяет более детально определять состояние, чем select
.
poll
не имеет ограничений на максимальный дескриптор файла, который вы можете использовать (и, что более важно, не имеет критических уязвимостей, когда вы не можете проверить дескрипторы файлов после ограничения FD_SETSIZE
).
Единственные недостатки, которые я могу придумать при использовании poll
, это то, что:
- в отличие от
pselect
, poll
не может атомарно демаскировать / маскировать сигналы, поэтому вы не можете использовать его для ожидания набора событий, который включает в себя как действия файлового дескриптора, так и сигналы, если вы не прибегаете к самопроверке.
poll
имеет разрешение только в миллисекундах для времени ожидания, а не микросекунды (select
) или наносекунды (pselect
).
Конечно, переносимость poll
больше не рассматривается. Любая система, достаточно старая для отсутствия poll
, полна стольких уязвимостей, что ее не следует подключать к сети.
Таким образом, если у вас нет особых потребностей (небольшие интервалы времени ожидания, неприятные взаимодействия сигналов, масштабирование до миллионов постоянных соединений и т. Д.), Я просто использовал бы poll
и покончил бы с этим. Как уже упоминалось, libevent
также является опцией, но это не чистый / безопасный код (его использование select
фактически вызывает опасный UB, пытающийся обойти ограничения select
!), И я нахожу код, который использует libevent
обычно намного сложнее, чем код, который просто использует poll
напрямую.