Next: La primitive poll Up: Les outils de sélection Previous: Les outils de sélection

La primitive select

Nous fournissont à la primitive select:

La fonction retourne pour chaque descripteur s'il est prêt en lecture, écriture, ou si l'évènement a eu lieu, et aussi le nombre de descripteur prêts. Cette information nous permet ensuite d'appeler read ou write sur le(s) bon(s) descripteur(s).

#include  <sys/types.h>
#include  <sys/time.h>
#include  <unistd.h>

int select(int maxfd,
           fd_set *readfds,
           fd_set *writefds,
           fd_set *exceptfds
           struct timeval *delai);

Retourne le nombre de descripteurs prêts, 0 en cas d'expiration du délai.

Paramétrage du délai:

struct timeval {
    long tv_sec;
    long tv_usec;
};
delai == NULL
Bloquant, attente infinie
delai->tv_sec == 0 && delai->tv_usec == 0
Non bloquant, retour immédiat.
delai->tv_sec > 0 && delai->tv_usec >0
Semi bloquant, attente jusqu'à ce qu'un descripteur soit prêt ou que le délai en secondes plus microsecondes soit écoulé.

Les trois pointeurs (readfds, writefds, et exceptfds) sur des ensembles de descripteurs sont utilisés pour indiquer en entrée les situations qui nous intéressent. C'est à priori (cela peut varier avec l'implémentation) des tableaux de bits avec un bit pour chaque descripteur du tableau de descripteurs du processus. L'entier maxfd est la position du dernier bit significatif de ce tableau de bits.

Les seules façons de manipuler ces ensembles de descripteurs sont:

FD_ZERO(fd_set \*fdset)
RAZ de l'ensemble.
FD_SET(int fd, fd_set *fdset)
Positionne le bit fd a 1.
FD_CLR(int fd, fd_set *fdset)
Positionne le bit fd à 0
FD_ISSET(int fd, fd_set *fdset)
vrai si le bit fd est à 1 dans l'ensemble.

Un descripteur est considéré comme prêt en lecture si un appel read dessus ne sera pas bloquant. De même, un descripteur est considéré comme prêt en écriture si un appel write ne sera pas bloquant. Les exceptions / évènements sont définis pour les lignes de communication qui acceptent les messages hors bande comme les sockets en mode datagramme.

Next: La primitive poll Up: Les outils de sélection Previous: Les outils de sélection

Dominique REVUZ
Mon Feb 2 12:10:31 MET 1998
Une Bug Un mail Merci