Что делает select, когда nfds больше длины битового массива в fd_set?Является ли это возможным? - PullRequest
0 голосов
/ 28 ноября 2018
int select(int nfds, 
       fd_set *readfds, 
       fd_set *writefds, 
       fd_set *exceptfds, 
       struct timeval *timeout);

Данный fd_set имеет длину 1024.Что делать, если мы хотим следить за 2048?Что выбирает делать, когда это происходит?Это случится вообще?

1 Ответ

0 голосов
/ 28 ноября 2018

Согласно спецификации , если nfds больше FD_SETSIZE, select() вернет -1 и установит errno в EINVAL.

В некоторых реализациях (включая системы Linux), вместо этого он будет записывать в биты вне структуры fd_set, что может повредить память в вашем приложении.(Цель состоит в том, чтобы позволить приложениям использовать более крупные fd_set структуры, но часто это приводит к сбою приложений, как только они пытаются использовать более 1024 файловых дескрипторов.)

Для работы с более чем1024 файловых дескриптора, вам нужно использовать API, отличный от select().Эти API часто зависят от системы;Одним из независящих от платформы вариантов является библиотека libev , которая предоставляет набор полезных абстракций для приложений с высокой степенью параллелизма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...