SELECT(2) Manuel du programmeur Linux SELECT(2) NOM select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - Multiplexage d'entrées/sorties synchrones. SYNOPSIS #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_CLR(int fd, fd_set *set); FD_ISSET(int fd, fd_set *set); FD_SET(int fd, fd_set *set); FD_ZERO(fd_set *set); DESCRIPTION select attend des changements d'état sur plusieurs descripteurs de fichiers. Il y a trois ensembles indépendants de descripteurs qui sont surveillés simultanément. Ceux de l'ensemble readfds seront surveillés pour vérifier si des caractères deviennent disponibles en lecture. Les descripteurs de l'ensemble writefds seront surveillés pour vérifier si l'on peut écrire immédiatement sur eux. Ceux de l'ensemble exceptfds seront surveillés pour l'occurence de conditions exceptionnelles. Il en existe deux types : l'arrivée de données hors-bande sur une socket, et la disponibilité d'informations d'état concer nant un pseudo-terminal en mode paquet. On peut indiquer un pointeur NULL à la place d'un ensemble si l'on ne veut pas en tenir compte. En sortie, les ensembles sont modifiés pour indiquer les descripteurs qui ont changé de statut. Quatre macros sont disponibles pour la manipulation des ensembles FD_ZERO efface un ensemble. FD_SET et FD_CLR ajoutent et suppriment un descripteur dans un ensemble. FD_ISSET vérifie si un descripteur est contenu dans un ensemble, principalement utile apres le retour de select. n est le numéro du plus grand descripteur des 3 ensembles, plus 1. timeout est une limite supérieure au temps passé dans select avant son retour. Elle peut être nulle, ce qui conduit select à revenir immédiatement. Si le timeout est Linux 8 Avril 1997 1 SELECT(2) Manuel du programmeur Linux SELECT(2) NULL (aucun), select peut bloquer indéfiniment. VALEUR RENVOYÉE En cas de réussite select renvoie le nombre de descrip teurs dans les ensembles, qui peut être nul si le délai de timeout a expiré avant que quoi que ce soit d'intéressant ne se produise. select retourne -1 s'il échoue, auquel cas errno contient le code d'erreur. ERREURS EBADF Un descripteur de fichier (dans l'un des ensem bles) est invalide. EINTR Un signal a été intercepté. EINVAL n est négatif ENOMEM Pas assez de mémoire pour le noyau. NOTES Certaines applications appellent select avec les trois ensembles vides, n nul, et un délai de timeout non nul, afin d'endormir, de manière portable, le processus avec une précision plus fine que la seconde. Sous Linux timeout est modifié pour indiquer le temps restant mais la plupart des autres implémentations ne le font pas. Ceci pose des problemes à la fois pour porter sur d'autres systèmes du code développé sous Linux qui utilise cette valeur de timeout modifiée, et pour porter sous Linux du code qui réutilise plusieurs fois la struc ture timeval sans la réinitialiser. La meilleure attitude à adopter est de considérer timeout comme indéfini après le retour de select. EXEMPLE #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main(void) { fd_set rfds; struct timeval tv; int retval; /* Surveiller stdin (fd 0) en attente d'entrées */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Pendant 5 secondes maxi */ tv.tv_sec = 5; Linux 8 Avril 1997 2 SELECT(2) Manuel du programmeur Linux SELECT(2) tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Considerer tv comme indéfini maintenant ! */ if (retval) printf("Données disponibles maintenant\n"); /* FD_ISSET(0, &rfds) est vrai */ else printf("Pas de données depuis 5 secondes\n"); exit(0); } CONFORMITÉ BSD 4.4 (la fonction select est apparue dans BSD 4.2). Généralement portable depuis ou vers des systèmes non-BSD supportant des clones de la couche sockets BSD (y compris les variantes du Systeme V). Néanmoins, sachez que les variantes du système V fixent une variable de timeout avant le retour alors que les variantes BSD ne le font pas. VOIR AUSSI accept(2), connect(2), read(2), recv(2), send(2), write(2) TRADUCTION Christophe Blaess, 1997. Linux 8 Avril 1997 3