Согласно спецификации , если nfds
больше FD_SETSIZE
, select()
вернет -1 и установит errno
в EINVAL.
В некоторых реализациях (включая системы Linux), вместо этого он будет записывать в биты вне структуры fd_set
, что может повредить память в вашем приложении.(Цель состоит в том, чтобы позволить приложениям использовать более крупные fd_set
структуры, но часто это приводит к сбою приложений, как только они пытаются использовать более 1024 файловых дескрипторов.)
Для работы с более чем1024 файловых дескриптора, вам нужно использовать API, отличный от select()
.Эти API часто зависят от системы;Одним из независящих от платформы вариантов является библиотека libev , которая предоставляет набор полезных абстракций для приложений с высокой степенью параллелизма.