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_set
est généralement capable de suivre jusqu'à 1024 descripteurs de fichiers.
Le moyen le plus efficace de suivre ceux qui fds
sont définis 0
et ceux qui sont définis 1
serait un jeu de bits, donc chacun fd_set
serait 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_set
est
1024/32 = 32 mots.
S'il nfds
s'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_SETSIZE
et à __NFDBITS
partir /usr/include/sys/select.h
des 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, select
expose un détail d'implémentation afin qu'il puisse être plus rapide.