epoll_wait(2) System Calls Manual epoll_wait(2) NOM epoll_wait, epoll_pwait epoll_pwait2 - Attendre un evenement d'E/S sur un descripteur de fichier epoll BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, int timeout, const sigset_t *_Nullable sigmask); int epoll_pwait2(int epfd, struct epoll_event *events, int maxevents, const struct timespec *_Nullable timeout, const sigset_t *_Nullable sigmask); DESCRIPTION L'appel systeme epoll_wait() attend la reception d'un evenement sur l'instance epoll(7) a laquelle se rapporte le descripteur de fichier epfd. La zone memoire pointee par events est utilisee pour renvoyer des informations issues de la liste preparee pour les descripteurs de fichier de la liste d'interets ayant des evenements disponibles. Un maximum de maxevents evenements sont renvoyes par epoll_wait(). Le parametre maxevents doit etre superieur a zero. L'argument timeout definit le temps en milliseconde pendant lequel epoll_wait() bloquera. Le temps est mesure avec l'horloge CLOCK_MONOTONIC. Un appel a epoll_wait() bloquera jusqu'a : - un descripteur de fichier delivre un evenement ; - l'appel est interrompu par un gestionnaire de signal ; - le delai expire. Remarquez que l'intervalle timeout sera arrondi a la granularite de l'horloge systeme et que les delais d'ordonnancement du noyau signifient que l'intervalle de blocage pourrait etre depasse d'une petite quantite. Un timeout de -1 force epoll_wait() a attendre indefiniment, alors qu'un timeout nul force epoll_wait() a se terminer immediatement, meme si aucun evenement n'est disponible. La struct epoll_event est decrite dans epoll_event(3type). Le champ data de chaque structure epoll_event renvoyee contiendra les memes donnees que celles de l'appel epoll_ctl(2) le plus recent (EPOLL_CTL_ADD, EPOLL_CTL_MOD) pour le descripteur de fichier ouvert correspondant. Le champ events est un masque de bits qui indique les evenements qui se sont produits pour la description de fichier ouvert correspondante. Voir epoll_ctl(2) pour une liste de bits qui peuvent apparaitre dans ce masque. epoll_pwait() La relation entre epoll_wait() et epoll_pwait() est similaire a celle entre select(2) et pselect(2) : de meme que pselect(2), epoll_pwait() permet a une application d'attendre de facon sure qu'un descripteur de fichier soit pret ou qu'un signal arrive. L'appel a epoll_pwait() suivant : ready = epoll_pwait(epfd, &events, maxevents, timeout, &sigmask); est equivalent a executer de facon atomique les appels suivants : sigset_t origmask; pthread_sigmask(SIG_SETMASK, &sigmask, &origmask); ready = epoll_wait(epfd, &events, maxevents, timeout); pthread_sigmask(SIG_SETMASK, &origmask, NULL); Le parametre sigmask peut valoir NULL, auquel cas, epoll_pwait() est equivalent a epoll_wait(). epoll_pwait2() L'appel systeme epoll_pwait2() est equivalent a epoll_pwait(), sauf concernant l'argument timeout. Il prend un argument de type timespec pour pouvoir indiquer le delai de resolution en nanosecondes. Cet argument fonctionne de la meme facon que pselect(2) et ppoll(2). Si timeout est NULL, epoll_pwait2() peut bloquer indefiniment. VALEUR RENVOYEE Lorsqu'il reussit, l'appel epoll_wait() renvoie le nombre de descripteurs prets pour les E/S demandees, ou zero si aucun descripteur n'est devenu pret pendant la duree timeout millisecondes. Si une erreur se produit, epoll_wait() renvoie -1 et errno est positionne pour indiquer l'erreur. ERREURS EBADF epfd n'est pas un descripteur de fichier valable. EFAULT La zone memoire pointee par events n'est pas accessible en ecriture. EINTR L'appel a ete interrompu par un signal avant, soit qu'aucun des evenements demandes n'ait eu lieu, soit que la temporisation timeout n'ait expire ; consultez signal(7). EINVAL Le descripteur epfd fourni n'est pas un descripteur epoll, ou le parametre maxevents est inferieur ou egal a zero. STANDARDS Linux. HISTORIQUE epoll_wait() Linux 2.6, glibc 2.3.2. epoll_pwait() Linux 2.6.19, glibc 2.6. epoll_pwait2() Linux 5.11. NOTES Alors qu'un thread est bloque par un appel d'epoll_pwait(), il est possible qu'un autre thread ajoute un descripteur de fichier a l'instance epoll attendue. Si le nouveau descripteur de fichier devient pret, il forcera le deblocage de l'appel epoll_wait(). Si plus d'un descripteur de fichier maxevents est pret quand epoll_wait() est appele, les appels epoll_wait() suivants tourneront autour des descripteurs de fichier prets. Ce comportement aide a eviter les scenarios de manque (starvation), ou un processus ne parvient pas a voir que des descripteurs de fichier supplementaires sont prets car il se concentre sur des descripteurs deja connus comme prets. Remarquez qu'il est possible d'appeler epoll_wait() sur une instance epoll dont la liste d'interets est actuellement vide (ou le devient car les descripteurs de fichier se ferment ou sont supprimes des interets dans un autre thread). L'appel bloquera jusqu'a ce qu'un descripteur de fichier soit ajoute plus tard a la liste d'interets (d'un autre thread) et que ce descripteur de fichier devienne pret. Differences entre bibliotheque C et noyau Les appels systeme epoll_pwait() et epoll_pwait2() bruts comportent un sixieme argument, size_t sigsetsize, qui indique la taille en octets de l'argument sigmask. La fonction enveloppe epoll_pwait() de la glibc indique cet argument comme une valeur fixe (egale a sizeof(sigset_t)). BOGUES Avant Linux 2.6.37, une valeur timeout plus grande qu'environ LONG_MAX / HZ millisecondes est traitee comme -1 (c'est-a-dire l'infini). Ainsi, par exemple, sur un systeme ou sizeof(long) vaut 4 et la valeur HZ du noyau vaut 1000, cela signifie que les temps d'attente superieurs a 35,79 minutes sont traites comme l'infini. VOIR AUSSI epoll_create(2), epoll_ctl(2), epoll(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 epoll_wait(2)