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
