| select | |||
Nomselect, 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); Descriptionselect 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. Plus précisément, on vérifie si un appel-système de lecture ne bloquera pas - en particulier un descripteur en fin-de-fichier sera considéré comme prêt. Les descripteurs de l'ensemble writefds seront surveillés pour vérifier si une écriture ne bloquera pas. 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 concernant 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 après 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 NULL (aucun), select peut bloquer indéfiniment. Valeur RenvoyéeEn cas de réussite select renvoie le nombre de descripteurs 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
NotesCertaines 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 structure 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;
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 Aussiaccept(2) , connect(2) , read(2) , recv(2) , send(2) , write(2)
TraductionChristophe Blaess, 1997.
|