SELECT(2)

NOM
select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - Multiplexage d'entrees/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'etat sur plusieurs descripteurs de fichiers.

Il y a trois ensembles independants de descripteurs qui sont surveilles simultanement. Ceux de l'ensemble readfds seront surveilles pour verifier si des caracteres deviennent disponibles en lecture. Les descripteurs de l'ensemble writefds seront surveilles pour verifier si l'on peut ecrire immediatement sur eux. Ceux de l'ensemble exceptfds seront surveilles pour l'occurence de conditions exceptionnelles. Il en existe deux types : l'arrivee de donnees hors-bande sur une socket, et la disponibilite d'informations d'etat concernant un pseudo-terminal en mode paquet. On peut indiquer un pointeur NULL a la place d'un ensemble si l'on ne veut pas en tenir compte. En sortie, les ensembles sont modifies pour indiquer les descripteurs qui ont change 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 verifie si un descripteur est contenu dans un ensemble, principalement utile apres le retour de select.

n est le numero du plus grand descripteur des 3 ensembles, plus 1.

timeout est une limite superieure au temps passe dans select avant son retour. Elle peut etre nulle, ce qui conduit select a retourner immediatement. Si le timeout est NULL (aucun), select peut bloquer indefiniment.

VALEUR RENVOYEE
En cas de reussite select renvoie le nombre de descripteurs dans les ensembles, qui peut etre nul si le delai de timeout a expire avant que quoi que ce soit d'interessant ne se produise. select retourne -1 s'il echoue, auquel cas errno contient le code d'erreur.

ERREURS

EBADF
    Un descripteur de fichier (dans l'un des ensembles) est invalide.

EINTR
    Un signal a ete intercepte.

EINVAL
    n est negatif

ENOMEM
    Pas assez de memoire pour le noyau.

NOTES
Certaines applications appellent select avec les trois ensembles vides, n nul, et un delai de timeout non nul, afin d'endormir, de maniere portable, le processus avec une precision plus fine que la seconde.

Sous Linux timeout est modifie pour indiquer le temps restant mais la plupart des autres implementations ne le font pas. Ceci pose des problemes a la fois pour porter sur d'autres systemes du code developpe sous Linux qui utilise cette valeur de timeout modifiee, et pour porter sous Linux du code qui reutilise plusieurs fois la structure timeval sans le reinitialiser. La meilleure attitude a adopter est de considerer timeout comme indefini apres 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'entrees */
    FD_ZERO(&rfds);
    FD_SET(0, &rfds);
    /* Pendant 5 secondes maxi */
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    retval = select(1, &rfds, NULL, NULL, &tv);
    /* Considerer tv comme indefini maintenant ! */
    if (retval)
        printf("Donnees disponibles maintenant\n");
        /* FD_ISSET(0, &rfds) est vrai */
    else
        printf("Pas de donnees depuis 5 secondes\n");
    exit(0);
}

CONFORMITE
BSD 4.4 (la fonction select est apparu dans BSD 4.2). Generalement portable depuis ou vers des systemes non-BSD supportant des clones de la couche sockets BSD (y compris les variantes du Systeme V). Neanmoins, sachez que les variantes du systeme 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)