Я заметил, что вы используете perror()
(функция ошибок POSIX), что заставляет меня думать, что вы используете операционную систему POSIX, что заставляет меня подозревать ее GNU / Linux.
select()
является переносимым, poll()
ориентирован на POSIX, а epoll()
ориентирован на Linux. Если вы используете GNU / Linux, я настоятельно рекомендую избегать select()
и использовать:
poll()
если вы опрашиваете только несколько десятков файловых дескрипторов
epoll()
, если вам нужно масштабировать до тысяч подключений, и это доступно.
Если ваше приложение не должно быть переносимым, и никакие требования не запрещают использовать расширения, используйте poll()
или epoll()
. Как только вы узнаете, как работает select()
, вы будете очень счастливы избавиться от него, особенно для того, что нужно масштабировать для обслуживания многих клиентов.
Если требуется переносимость, посмотрите, существует ли poll()
или epoll()
во время конфигурации сборки, и используйте либо в пользу select()
.
Заметьте, epoll()
не появлялся до Linux 2.5 (что-то), поэтому лучше всего использовать оба.