Manpages

NOM

epoll_wait, epoll_pwait - Attendre un événement sur un descripteur epoll

SYNOPSIS

#include <sys/epoll.h>

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 *
sigmask);

DESCRIPTION

L’appel système epoll_wait() attend un événement sur l’instance epoll(7) indiquée par le descripteur epfd. La zone mémoire pointée par events contiendra les événements disponibles pour l’appelant. Un maximum de maxevents événements sont renvoyés par epoll_wait(). Le paramètre maxevents doit être supérieur à zéro.

The timeout argument specifies the number of milliseconds that epoll_wait() will block. Time is measured against the CLOCK_MONOTONIC clock. The call will block until either:

*

un descripteur de fichier délivre un événement ;

*

l’appel est interrompu par un gestionnaire de signal ;

*

le délai expire.

Remarquez que l’intervalle timeout sera arrondi à la granularité de l’horloge système et que les délais d’ordonnancement du noyau signifient que l’intervalle de blocage pourrait être dépassé d’une petite quantité. Un timeout de -1 force epoll_wait() à attendre indéfiniment, alors qu’un timeout nul force epoll_wait() à se terminer immédiatement, même si aucun événement n’est disponible.

The struct epoll_event is defined as:

typedef union epoll_data {
    void    *ptr;
    int      fd;
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;


struct epoll_event {
    uint32_t     events;    /* Événements epoll */
    epoll_data_t data;      /* Variable utilisateur */
};

The data field of each returned structure contains the same data as was specified in the most recent call to epoll_ctl(2) (EPOLL_CTL_ADD, EPOLL_CTL_MOD) for the corresponding open file description. The events field contains the returned event bit field.

epoll_pwait()
La relation entre epoll_wait() et epoll_pwait() est similaire à celle entre select(2) et pselect(2) : de même que pselect(2), epoll_pwait() permet à une application d’attendre de façon sûre qu’un descripteur de fichier soit prêt ou qu’un signal arrive.

L’appel à epoll_pwait() suivant :

ready = epoll_pwait(epfd, &events, maxevents, timeout, &sigmask);

est équivalent à exécuter de façon 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 paramètre sigmask peut valoir NULL, auquel cas, epoll_pwait() est équivalent à epoll_wait().

VALEUR DE RETOUR

Lorsqu’il réussit, l’appel epoll_wait() renvoie le nombre de descripteurs prêts pour les E/S demandées, ou zéro si aucun descripteur n’est devenu prêt pendant la durée timeout millisecondes. Si une erreur se produit, epoll_wait() renvoie -1 et errno contient le code approprié.

ERREURS

EBADF

epfd n’est pas un descripteur de fichier valable.

EFAULT

La zone mémoire pointée par events n’est pas accessible en écriture.

EINTR

L’appel a été interrompu par un signal avant, soit qu’aucun des événements demandés n’ait lieu, soit que la temporisation timeout n’expire ; consultez signal(7).

EINVAL

Le descripteur epfd fourni n’est pas un descripteur epoll, ou le paramètre maxevents est inférieur ou égal à zéro.

VERSIONS

epoll_wait a été introduite dans le noyau Linux 2.6. La prise en charge par la glibc a été ajoutée dans la version 2.3.2.

epoll_pwait a été introduite dans le noyau Linux 2.6.19. La prise en charge par la glibc a été ajoutée dans la version 2.6.

CONFORMITÉ

epoll_wait() est spécifique à Linux.

NOTES

While one thread is blocked in a call to epoll_wait(), it is possible for another thread to add a file descriptor to the waited-upon epoll instance. If the new file descriptor becomes ready, it will cause the epoll_wait() call to unblock.

If more than maxevents file descriptors are ready when epoll_wait() is called, then successive epoll_wait() calls will round robin through the set of ready file descriptors. This behavior helps avoid starvation scenarios, where a process fails to notice that additional file descriptors are ready because it focuses on a set of file descriptors that are already known to be ready.

Note that it is possible to call epoll_wait() on an epoll instance whose interest list is currently empty (or whose interest list becomes empty because file descriptors are closed or removed from the interest in another thread). The call will block until some file descriptor is later added to the interest list (in another thread) and that file descriptor becomes ready.

BOGUES

In kernels before 2.6.37, a timeout value larger than approximately LONG_MAX / HZ milliseconds is treated as -1 (i.e., infinity). Thus, for example, on a system where sizeof(long) is 4 and the kernel HZ value is 1000, this means that timeouts greater than 35.79 minutes are treated as infinity.

C library/kernel differences
The raw epoll_pwait() system call has a sixth argument, size_t sigsetsize, which specifies the size in bytes of the sigmask argument. The glibc epoll_pwait() wrapper function specifies this argument as a fixed value (equal to sizeof(sigset_t)).

VOIR AUSSI

epoll_create(2), epoll_ctl(2), epoll(7)

COLOPHON

Cette page fait partie de la publication 5.05 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l’adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <http://www.blaess.fr/christophe/>;, Stéphan Rafin <stephan.rafin [AT] laposte.net>, Thierry Vignaud <tvignaud [AT] mandriva.com>, François Micaux, Alain Portal <aportal [AT] univ-montp2.fr>, Jean-Philippe Guérard <fevrier [AT] tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon [AT] wanadoo.fr>, Julien Cristau <jcristau [AT] debian.org>, Thomas Huriaux <thomas.huriaux [AT] gmail.com>, Nicolas François <nicolas.francois [AT] centraliens.net>, Florentin Duneau <fduneau [AT] gmail.com>, Simon Paillard <simon.paillard [AT] resel.fr>, Denis Barbier <barbier [AT] debian.org> et David Prévot <david [AT] tilapin.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à <debian-l10n-french [AT] lists.org>.