Dans "Programmation avancée dans l'environnement UNIX" , W. Richard Stevens dit qu'il s'agit d'une optimisation des performances:
En spécifiant le descripteur le plus élevé qui nous intéresse, le noyau peut éviter de parcourir des centaines de bits inutilisés dans les trois ensembles de descripteurs, en recherchant les bits qui sont activés.
(1ère édition, page 399)
Si vous faites n'importe quel type de programmation de systèmes UNIX, le livre APUE est fortement recommandé.
MISE À JOUR
An fd_setest généralement capable de suivre jusqu'à 1024 descripteurs de fichiers.
Le moyen le plus efficace de suivre ceux qui fdssont définis 0et ceux qui sont définis 1serait un jeu de bits, donc chacun fd_setserait composé de 1024 bits.
Sur un système 32 bits, un entier long (ou "mot") est de 32 bits, ce qui signifie que chacun fd_setest
1024/32 = 32 mots.
S'il nfdss'agit de quelque chose de petit, comme 8 ou 16, qu'il serait dans de nombreuses applications, il suffit de regarder à l'intérieur du premier mot, qui devrait clairement être plus rapide que de regarder à l'intérieur des 32.
(Voir FD_SETSIZEet à __NFDBITSpartir /usr/include/sys/select.hdes valeurs sur votre plate-forme.)
MISE À JOUR 2
Quant à savoir pourquoi la signature de fonction n'est pas
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Je suppose que c'est parce que le code essaie de conserver tous les arguments dans les registres , de sorte que le processeur peut travailler plus rapidement sur eux, et s'il devait suivre 2 variables supplémentaires, le processeur pourrait ne pas avoir suffisamment de registres.
En d'autres termes, selectexpose un détail d'implémentation afin qu'il puisse être plus rapide.