poll   Début   Suivant   Sommaire   Préc.page.lue   Accueil
Section: Manuel du programmeur Linux (2)
Updated: 23 avril 2008
Sommaire  



NOM   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
poll, ppoll - Attendre un événement concernant un descripteur de fichier  



SYNOPSIS   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
#include <poll.h>

int poll(struct pollfd *ufds, nfds_t nfds, int délai);
int poll(struct pollfd *fds, nfds_t nfds, int délai);

#define _GNU_SOURCE
#include <poll.h>

int ppoll(struct pollfd *fds, nfds_t nfds, 
        const struct timespec *délai, const sigset_t *sigmask);
 



DESCRIPTION   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
poll() efectue une tâche similaire à select(2) : il attend que l'un des descripteurs de fichiers parmi un ensemble soit prêt pour effectuer des entrées-sorties.

L'ensemble des descripteurs de fichiers à surveiller est spécifié dans l'argument fds qui est un tableau de structures nfds structures du type :

struct pollfd {
    int   fd;         /* Descripteur de fichier */
    short events;     /* Événements attendus    */
    short revents;    /* Événements détectés    */
};
Le champ fd contient un descripteur de fichier ouvert. Le champ events est un paramètre d'entrée, un masque de bits indiquant les événements qui intéressent l'application. Le champ revents est un paramètre de sortie, rempli par le noyau avec les événements qui se sont effectivement produits. Les bits renvoyés dans revents peuvent inclure ceux spécifiés dans events, POLLERR, POLLHUP ou POLLNVAL. (Ces trois bits n'ont pas de signification dans la demande events, et se trouvent positionnés dans la valeur de retour revents si l'une des conditions correspondantes se produit).

Si aucun événement attendu (ni aucune erreur) ne s'est déjà produit, poll() bloquera jusqu'à ce que l'un des événements survienne. L'argument délai spécifie une limite haute, en millisecondes, sur le temps pendant lequel poll() bloquera. Spécifier une valeur ngative pour délai signifie un délai d'attente infini.

Les bits qui peuvent être positionnés/renvoyés dans events et revents sont définis dans <sys/poll.h> :

POLLIN
Il y a des données disponibles à la lecture.
POLLPRI
Il y a des données urgentes à lire (par exemple, des données « hors bande » sur une socket TCP ; un pseudo terminal maître a vu l'esclave changer d'état).
POLLOUT
Une écriture ne bloquera pas.
POLLRDHUP (depuis Linux 2.6.17)
Le pair de la socket stream a fermé la connexion, ou a été mis hors service lors de l'écriture sur la connexion. La macro de test de fonctionnalité _GNU_SOURCE doit être définie pour obtenir cette définition.
POLLERR
Condition d'erreur (sortie seulement).
POLLHUP
Déconnexion (sortie seulement).
POLLNVAL
Requête invalide : fd n'est pas ouvert (sortie seulement).

Si on compile avec _XOPEN_SOURCE définie, on a également les choses suivantes, qui ne contient pas plus d'information que les bits précédents :

POLLRDNORM
Équivalent à POLLIN.
POLLRDBAND
Données prioritaires disponibles à la lecture (généralement pas utilisé sous Linux).
POLLWRNORM
Équivalent à POLLOUT.
POLLWRBAND
Écriture prioritaire possible.

Linux connait également POLLMSG mais ne l'utilise pas.  




ppoll()   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
la relation entre poll() et ppoll() est analogue à la relation entre select(2) et pselect(2) : comme pselect(2), ppoll() permet à une application d'attendre sûrement que soit un descripteur de fichier devienne prêt, soit qu'un signal soit capturé.

Outre la différence de l'argument délai, l'appel ppoll() suivant :


    ready = ppoll(&fds, nfds, timeout, &sigmask);

est équivalent à l'exécution atomique des appels suivants :

    sigset_t origmask;

    sigprocmask(SIG_SETMASK, &sigmask, &origmask);
    ready = poll(&fds, nfds, timeout);
    sigprocmask(SIG_SETMASK, &origmask, NULL);

Voir la description de pselect(2) pour une explication sur pourquoi ppoll() est nécessaire.

Si l'argument sigmask est défini comme NULL, aucune manipulation de masque de signal n'est effectuée (et ainsi ppoll() ne diffère de poll() que dans la précision de l'argument timeout).

L'argument timeout spécifie une limite haute sur le temps total pendant lequel ppoll() bloquera. Cet argument est un pointeur sur une structure de la forme :


struct timespec {
    long    tv_sec;         /* secondes */
    long    tv_nsec;        /* nanosecondes */
};

Si timeout est spécifié comme NULL, bloquera indéfiniment.  




VALEUR RENVOYÉE   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
S'il réussit, poll() renvoie une valeur positive représentant le nombre de structures ayant un champ revents non nul. C'est-à-dire le nombre de structures pour lesquels un événement attendu, ou une erreur, s'est produit. Une valeur de retour nulle indique un dépassement du délai d'attente et qu'aucun descripteur de fichier n'était prêt. S'il échoue, poll() renvoie -1, et errno contient le code d'erreur.  



ERREURS   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
EBADF
Un descripteur de fichier invalide est présent dans un ensemble.
EFAULT
La table fournie en argument n'est pas dans l'espace d'adressage du processus appelant.
EINTR
Un signal a été reçu avant qu'un événement intéressant ne se produise.
EINVAL
La valeur nfds dépasse la valeur RLIMIT_NOFILE.
ENOMEM
Pas assez de mémoire pour allouer la table des descripteurs de fichiers.
 



VERSIONS   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
L'appel système poll() a été introduit dans la version 2.1.23 du noyau Linux. La fonction de bibliothèque poll() est apparue dans la version 5.4.28 de la libc, et fournit une émulation basée sur l'appel système select(2) si le noyau n'a pas d'appel système poll().

L'appel système a été ajouté à Linux dans le noyau 2.6.16. ppoll() a été ajouté à Linux dans le noyau 2.6.16. La fonction de bibliothèque ppoll() a été ajoutée dans la glibc 2.4  




CONFORMITÉ   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
poll() est conforme à POSIX.1-2001. ppoll() est spécifique à Linux.  



NOTES   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
Certaines implémentations définissent une constante non standard INFTIM de valeur -1 à utiliser comme délai. Cette constante n'est pas fournie par la glibc.  



Notes Linux   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
L'appel système Linux ppoll() modifie son argument délai. Toutefois, la fonction enveloppe de la glibc cache ce comportement en utilisant une variable locale pour l'argument délai qui est passée à l'appel système. Ainsi, la fonction ppoll() de la glibc ne modifie pas son argument délai.  



BOGUES   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
Voir la section BOGUES de select(2).  



VOIR AUSSI   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
select(2) select_tut(2), feature_test_macros(7)  



TRADUCTION   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 21 juillet 1997 et révisée le 6 juin 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 poll ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.


 



Sommaire   Début   Suivant   Sommaire   Préc.page.lue   Accueil
NOM
SYNOPSIS
DESCRIPTION
ppoll()
VALEUR RENVOYÉE
ERREURS
VERSIONS
CONFORMITÉ
NOTES
Notes Linux
BOGUES
VOIR AUSSI
TRADUCTION

Table des mots clés   Début   Suivant   Sommaire   Préc.page.lue   Accueil
EBADFERREURS
EFAULTERREURS
EINTRERREURS
EINVALERREURS
ENOMEMERREURS



Ce document a été créé par man2html suivi de man2html.pl, le 17/10/2008 17:51:00, en utilisant les pages de 'man'.
 

Valid HTML 4.01 Transitional