Bash-Linux.com : Le SHELL pour les nuls

  Actuellement 46 lignes de commande disponibles
login as: root
root@213.186.33.18's password:
Last login: Thu Mar 11 20:18:24 2010 from 38.107.191.117
[root@bash-linux ~] # echo "Bienvenue sur Bash-Linux.com"_
 Manuel des commandes UNIX (man) Version française

Indiquez la fonction :

Man Select en français

SELECT(2) Manuel du programmeur Linux SELECT(2)
 
NOM


select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - Multiplexage d'entrees-sorties synchrones.
 
SYNOPSIS


/* D'apres POSIX.1-2001 */ #include /* D'apres les standards precedents */ #include #include #include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set); #define _XOPEN_SOURCE 600 #include int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);
 
DESCRIPTION


Les fonctions select() et pselect() permettent a un programme de surveiller plusieurs descripteurs de fichier, attendant que l'un ou plusieurs des descripteurs de fichiers deviennent prets pour cer- taines classes d'operations d'entrees-sorties (par exemple, entree pos- sible). Un descripteur de fichier est considere comme pret s'il est possible d'effectuer l'operation d'entrees-sorties coreespondante (par exemple, un read(2)) sans bloquer. Le comportement de select() et pselect() est identique, avec trois dif- ferences : (i) La fonction select() utilise un delai exprime avec une struct timeval (secondes et microsecondes), alors que pselect() utilise une struct timespec (secondes et nanosecondes). (ii) La fonction select() peut modifier le parametre timeout pour indiquer le temps restant. La fonction pselect() ne change pas ce parametre. (iii) La fonction select() n'a pas de parametre sigmask et se comporte comme pselect() avec une valeur NULL pour sigmask Il y a trois ensembles independants de descripteurs surveilles simul- tanement. Ceux de l'ensemble readfds seront surveilles pour verifier si des caracteres deviennent disponibles en lecture. Plus precisement, on verifie si un appel systeme de lecture ne bloquera pas ; en partic- ulier un descripteur en fin-de-fichier sera considere comme pret. Les descripteurs de l'ensemble writefds seront surveilles pour verifier si une ecriture ne bloquera pas. Ceux de exceptfds seront surveilles pour l'occurrence de conditions exceptionnelles. En sortie, les ensembles sont modifies pour indiquer les descripteurs de fichier qui ont change d'etat. Chacun des trois ensembles de descripteurs de fichier doivent etre specifies comme NULL si aucun descripteur de fichier n'est surveille pour la classe correspondante devenement. Quatre macros sont disponibles pour la manipulation des ensembles FD_ZERO() efface un ensemble. FD_SET() et FD_CLR() ajoutent et suppri- ment, respectivement, un descripteur de fichier dans un ensemble. FD_ISSET() verifie si un descripteur de fichier est contenu dans un ensemble, principalement utile apres le retour de select(). nfds est le numero du plus grand descripteur de fichier des 3 ensem- bles, plus 1. timeout est une limite superieure au temps passe dans select() avant son retour. Elle peut etre nulle, ce qui conduit select() a revenir immediatement. (Ce qui sert pour des surveillance en polling). Si le timeout est NULL (aucun), select() peut bloquer indefiniment. sigmask est un pointeur sur un masque de signaux (voir sigprocmask(2)). S'il n'est pas NULL, alors pselect() remplace d'abord le masque de sig- naux en cours par celui indique dans sigmask, puis invoque la fonction select , et enfin restaure le masque de signaux a nouveau. Outre la difference dans la precision de l'argument timeout, l'appel pselect() suivant ready = pselect(nfds, &readfds, &writefds, &exceptfds, timeout, &sigmask); est equivalent a l'execution atomique des apples suivants : sigset_t origmask; sigprocmask(SIG_SETMASK, &sigmask, &origmask); ready = select(nfds, &readfds, &writefds, &exceptfds, timeout); sigprocmask(SIG_SETMASK, &origmask, NULL); La raison pour laquelle pselect() est necessaire est que si l'on veut attendre soit un signal, soit qu'un descripteur de fichier soit pret, alors un test atomique est necessaire pour eviter les situations de concurrence. (Supposons que le gestionnaire de signaux active un dra- peau global et revienne. Alors un test de ce drapeau, suivi d'un appel select() peut bloquer indefiniment si le signal arrive juste apres le test mais avant l'appel. l'inverse, pselect() permet de bloquer le signal d'abord, traiter les signaux deja recus, puis invoquer pselect() avec le sigmask, desire, en evitant la situation de blocage). Delai maximal Les structures temporelles concernees sont definies dans comme ceci : struct timeval { long tv_sec; /* secondes */ long tv_usec; /* microsecondes */ }; et struct timespec { long tv_sec; /* secondes */ long tv_nsec; /* nanosecondes */ }; (Toutefois, voir plus loin les versions POSIX.1-2001.) Certaines applications appellent select() nul, et un delai timeout non nul, afin d'endormir, de maniere portable, le processus avec une preci- sion plus fine que la seconde. Sous Linux, la fonction select() modifie timeout pour indiquer le temps restant mais la plupart des autres implementations ne le font pas. (POSIX.1-2001 permet les deux comportements.) 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 la reinitialiser. La meilleure attitude a adopter est de considerer time- out comme indefini apres le retour de select().
 
VALEUR RENVOYEE


En cas de reussite select() et pselect() renvoient le nombre de descripteurs de fichier dans les trois ensembles de descripteurs retournes (c'est-a-dire, le nombre total de bits a 1 dans readfds, writefds, exceptfds) qui peut etre nul si le delai de timeout a expire avant que quoi que ce soit d'interessant ne se produise. Ils retour- nent -1 s'ils echouent, auquel cas errno contient le code d'erreur.
 
ERREURS


EBADF Un descripteur de fichier (dans l'un des ensembles) est invalide. (Peut etre un descripteur de fichiers qui etait deja ferme ou un sur lequel une erreur est survenue. EINTR Un signal a ete intercepte. EINVAL nfds est negatif ou la valeur contenue par timeout n'est pas valide. ENOMEM Pas assez de memoire pour le noyau.
 
NOTES


avec les trois ensembles vides, n
 
EXEMPLE


#include #include #include #include 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 == -1) perror("select()"); else if (retval) printf("Donnees disponibles maintenant\n"); /* FD_ISSET(0, &rfds) est vrai */ else printf("Pas de donnees depuis 5 secondes\n"); return (0); }
 
CONFORMITE


select() est conforme a POSIX.1-2001 et BSD 4.4 (la fonction select() est apparue dans BSD 4.2). Generalement portable depuis ou vers des systemes non-BSD supportant des clones de la couche sockets BSD (y com- pris 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. La fonction pselect() est definie dans POSIX.1g et dans POSIX.1-2001.
 
NOTES


Un ensemble fd_set est un tampon de taille fixe. Executer FD_CLR() ou FD_SET() avec fd negatif ou superieur ou egal a FD_SETSIZE resultera en un comportement indefini. Plus encore, POSIX demande que fd soit un descripteur de fichier valide. En ce qui concerne les types impliques, la situation classique est que les deux champs de la structure timeval soient des long (comme ci- dessous), et que la structure soit definie dans . La situ- ation avec POSIX 1003.1-2001 est struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; avec la structure definie dans et les types de donnees time_t et suseconds_t definis dans . Concernant les prototypes, on demande classiquement l'inclusion de pour select(). Avec POSIX 1003.1-2001, on prefere inclure pour select() et pselect(). Les bibliotheques libc4 et libc5 n'avaient pas d'en-tete , mais avec les glibc 2.0 et suivantes le fichier existe. Pour la glibc 2.0, le prototype de pselect() est toujours errone. Avec la glibc 2.1-2.2.1 le prototype de pselect() est fourni si la constante _GNU_SOURCE est definie avant l'inclusion. Avec glibc 2.2.2-2.2.4, il faut que la constante _XOPEN_SOURCE soit definie avec une valeur superieure ou egale a 600. Quoiqu'il en soit, depuis POSIX 1003.1-2001, le bon prototype devrait etre defini par defaut.
 
VERSIONS


pselect() a ete ajoute a Linux dans le noyau 2.6.16. Avant cela, pselect() etait emule dans la glibc (mais voir BOGUES).
 
NOTES LINUX


L'appel systeme Linux pselect() mdifie son argument timeout. Toute- fois, la fonction enveloppe de la glibc cache ce comportement en util- isant une variable locale pour l'argument timeout qui est passe a l'appel systeme. Ainsi, la fonction pselect() de la glibc ne modifie pas son argument timeout ; c'est le comportement requis par POSIX.1-2001.
 
BOGUES


La glibc 2.0 fournit une version de pselect() qui n'a pas d'argument sigmask. Depuis la version 2.1, la glibc fournissait une emulation de pselect() qui est implementee en utilisant sigprocmask(2) et select(). Cette implemntation reste vulnerable aux situations de concurrence pour lesquelles pselect() a ete concue afn de les prevenir. Sur les sys- temes ou manque pselect(), +reliable (and more portable) signal trap- ping can be achieved +using the self-pipe trick +(where a signal han- dler writes a byte to a pipe whose other end +is monitored by +.BR select () +in the main program.) une capture de signal fiable (et plus portable) peut etre realisee en utilisant l'astuce auto-tube (ou un gestionnaire de signal ecrit un octet dans un tube dont l'autre fin est surveillee par select() dans la boucle principale). Sous Linux, select() peut signaler un descripteur de fichier socket comme pret a lire alors qu'une lecture suivante bloque. Cela peut, par exemple, survenir lorsque des donnees sont arrivees mais qui, apres verification, ont une mauvaise somme de controle et sont rejetees. Cela peut egalement arriver dans d'autres circonstances ou le descripteur de fichier est faussement rapporte comme etant pret. +. +. Aussi, il est plus sr d'utiliser O_NONBLOCK sur des sockets qui ne devraient pas bloquer.
 
VOIR AUSSI


Pour un tutoriel avec des exemples, voir select_tut(2). D'autres pages ayant un vague rapport : accept(2), connect(2), poll(2), read(2), recv(2), send(2), sigprocmask(2), write(2), epoll(7), fea- ture_test_macros(7)
 
TRADUCTION


Ce document est une traduction realisee par Christophe Blaess le 13 octobre 1996 et revisee le 14 aot 2006. L'equipe de traduction a fait le maximum pour realiser une adaptation francaise de qualite. La version anglaise la plus a jour de ce document est toujours consultable via la commande : LANG=C man 2 select . N'hesitez pas a signaler a l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel. Linux 2.6.16 11 mars 2006 SELECT(2)


 Dernières recherches
Man  en anglais Man select en anglaisMan  en français Man select en français
Man  en anglais Man boot en anglaisMan  en français Man boot en français
Man  en anglais Man mount en anglaisMan  en français Man mount en français
Man  en anglais Man regcomp en anglaisMan  en français Man regcomp en français
Man  en anglais Man uptime en anglaisMan  en français Man uptime en français
Man  en anglais Man fmtmsg en anglaisMan  en français Man fmtmsg en français
Man  en anglais Man sched_setscheduler en anglaisMan  en français Man sched_setscheduler en français
Man  en anglais Man forkpty en anglaisMan  en français Man forkpty en français
Man  en anglais Man rsync en anglaisMan  en français Man rsync en français
Man  en anglais Man pause en anglaisMan  en français Man pause en français
Man  en anglais Man remove en anglaisMan  en français Man remove en français
Man  en anglais Man inet_aton en anglaisMan  en français Man inet_aton en français
Man  en anglais Man sigprocmask en anglaisMan  en français Man sigprocmask en français
Man  en anglais Man mkfs en anglaisMan  en français Man mkfs en français
Man  en anglais Man split en anglaisMan  en français Man split en français

 Recherche

Dans ce moteur de recherche, vous pouvez taper directement votre besoin, en une phrase normale, humaine.
Exemple : vous cherchez comment remplacer un mot par un autre dans tous les fichiers d'un certain dossier. Vous pouvez écrire "Comment remplacer un mot par un autre dans tous les fichiers d'un dossier". Le moteur vous ramenera les résultats en fonction de leur pertinence.
Vous pouvez bien sûr ne chercher qu'un seul mot-clé, par exemple "find".
 Toutes les lignes de code
Par popularité
Par fonction
Recherche avancée
 Les logiciels SHELL/SSH
Putty
Astuces Bash
Faire du SHELL avec PHP!
 La doc officielle
Les man Linux en français
Les man Linux en anglais
 Proposer vos bash
Partagez vos lignes!
 Les requêtes
Déposer une requête
Voir/répondre à une requête
 Quelques sites interessants
Bons sites pour apprendre
 Rechercher