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