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;
};
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