Man page - eventfd_write(3)

Packages contains this manual

Available languages:

en fr ja ru

Manual

eventfd

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
VERSIONS
Différences entre bibliothÚque C et noyau
Fonctionnalités supplémentaires de la glibc
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

eventfd - CrĂ©er un descripteur de fichier pour la notification d’évĂ©nements

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/eventfd.h>

int eventfd(unsigned int initval , int flags );

DESCRIPTION

eventfd () créée un « objet eventfd » qui peut ĂȘtre utilisĂ© par les applications de l’espace utilisateur pour l’attente ou la notification d’un Ă©vĂ©nement et par le noyau pour notifier des applications de certains Ă©vĂ©nements. Les objets contiennent un compteur entier non signĂ© sur 64 bits ( uint64_t ) qui est maintenu par le noyau. Ce compteur est initialisĂ© Ă  la valeur spĂ©cifiĂ©e par le paramĂštre initval .

Comme valeur de retour, eventfd () renvoie un nouveau descripteur de fichier qui peut ĂȘtre utilisĂ© pour se rĂ©fĂ©rer Ă  l’objet eventfd.

Les valeurs suivantes peuvent ĂȘtre incluses (avec un OU logique) dans flags pour changer le comportement de eventfd () :
EFD_CLOEXEC
(depuis Linux 2.6.27)

Placer l’attribut « close-on-exec » ( FD_CLOEXEC ) sur le nouveau descripteur de fichier. Consultez la description de l’attribut O_CLOEXEC dans open (2) pour savoir pourquoi cela peut ĂȘtre utile.

EFD_NONBLOCK (depuis Linux 2.6.27)

Placer l’attribut d’état de fichier O_NONBLOCK sur la description du fichier ouvert rĂ©fĂ©rencĂ©e par le nouveau descripteur de fichier (consulter open (2)). Utiliser cet attribut Ă©conomise des appels supplĂ©mentaires Ă  fcntl (2) pour obtenir le mĂȘme rĂ©sultat.

EFD_SEMAPHORE (depuis Linux 2.6.30)

Fournir une sémantique similaire aux sémaphores pour les lectures sur le nouveau descripteur de fichier. Voir ci-dessous.

Jusqu’à Linux 2.6.26, le paramĂštre flags n’est pas utilisĂ© et doit valoir zĂ©ro.

Les opĂ©rations suivantes peuvent ĂȘtre effectuĂ©es sur le descripteur de fichier renvoyĂ© par eventfd () :
read
(2)

Chaque read (2) qui rĂ©ussit renvoie un entier sur 8 octets. read (2) Ă©chouera avec l’erreur EINVAL si la taille du tampon fourni est de moins de 8 octets.

La valeur renvoyĂ©e par read (2) utilise l’ordre des octets de l’hĂŽte, c’est-Ă -dire l’ordre des octets natif pour les entiers sur la machine hĂŽte.

La sĂ©mantique de read (2) dĂ©pend du fait que le compteur eventfd a actuellement une valeur non nulle, et que l’attribut EFD_SEMAPHORE Ă©tait spĂ©cifiĂ© lors de la crĂ©ation du descripteur de fichier eventfd :

-

Si EFD_SEMAPHORE n’était pas spĂ©cifiĂ© et si le compteur eventfd a une valeur non nulle, un read (2) renverra 8 octets contenant cette valeur, et la valeur du compteur sera remise Ă  zĂ©ro.

-

Si EFD_SEMAPHORE était spécifié et si le compteur eventfd a une valeur non nulle, un read (2) renverra 8 octets contenant la valeur 1, et la valeur du compteur sera décrémentée de 1.

-

Si le compteur eventfd est nul au moment de l’appel Ă  read (2), l’appel bloquera jusqu’à ce que le compteur devienne non nul (auquel cas l’appel Ă  read (2) sera traitĂ© comme dĂ©crit ci-dessus), ou Ă©chouera avec l’erreur EAGAIN si le descripteur de fichier est en mode non bloquant.

write (2)

Un appel Ă  write (2) ajoute au compteur la valeur de l’entier sur 8 octets fourni dans le tampon. La valeur maximale qui peut ĂȘtre stockĂ©e dans le compteur est le plus grand entier non signĂ© sur 64 bits moins 1 (c’est-Ă -dire 0xfffffffffffffffe). Si l’addition rĂ©sulte en un compteur qui dĂ©passerait la valeur maximale, le write (2) bloquera jusqu’à ce qu’un read (2) soit effectuĂ© sur le descripteur de fichier, ou Ă©chouera avec l’erreur EAGAIN si le descripteur de fichier est en mode non bloquant.

Un write (2) Ă©chouera avec l’erreur EINVAL si la taille du tampon fourni est de moins de 8 octets ou si l’on essaie d’écrire la valeur 0xffffffffffffffff.

poll (2)
select
(2)
(et similaire)

Le descripteur de fichier prend en charge les poll (2) (et de façon analogue epoll (7)) et select (2) de la façon suivante :

-

Le descripteur de fichier est lisible (le paramĂštre readfds de select (2) ; l’attribut POLLIN de poll (2)) si le compteur a une valeur supĂ©rieure Ă  0.

-

Le descripteur de fichier est disponible en Ă©criture (le paramĂštre writefds de select (2) ; l’attribut POLLOUT de poll (2)) s’il est possible d’écrire une valeur d’au moins « 1 » sans bloquer.

-

Si un dĂ©passement de la valeur du compteur a Ă©tĂ© dĂ©tectĂ©e, select (2) indique que le descripteur de fichier est disponible en lecture et en Ă©criture et poll (2) renvoie un Ă©vĂ©nement POLLERR . Comme indiquĂ©e ci-dessus, un write (2) ne peut jamais produire de dĂ©passement. Cependant, un dĂ©passement peut se produire si un « signal post » eventfd de 2^64 a Ă©tĂ© effectuĂ© par le sous-systĂšme KAIO (thĂ©oriquement possible, mais trĂšs peut probable en pratique). Si un dĂ©passement survient, un read (2) renverra la valeur maximale d’un uint64_t (c’est-Ă -dire 0xffffffffffffffff).

Le descripteur de fichier eventfd prend également en charge les autres interfaces de multiplexage de descripteurs de fichier : pselect (2) et ppoll (2).

close (2)

Quand le descripteur de fichier n’est plus nĂ©cessaire il doit ĂȘtre fermĂ©. Quand tous les descripteurs de fichier associĂ©s au mĂȘme objet eventfd ont Ă©tĂ© fermĂ©s, les ressources pour cet objet sont libĂ©rĂ©es par le noyau.

Une copie d’un descripteur de fichier créé par eventfd () est hĂ©ritĂ©e par le fils produit par fork (2). Le duplicata du descripteur de fichier est associĂ© au mĂȘme objet eventfd. Les descripteurs de fichier créés par eventfd () sont prĂ©servĂ©s au travers des exĂ©cutions par execve (2), sauf si l’attribut « close-on-exec » est positionnĂ©.

VALEUR RENVOYÉE

S’il rĂ©ussit, eventfd () renvoie un nouveau descripteur de fichier eventfd. En cas d’erreur, il renvoie -1 et remplit errno avec la valeur d’erreur.

ERREURS

EINVAL

Une valeur non prise en compte a été spécifiée dans flags .

EMFILE

La limite du nombre de descripteurs de fichiers par processus a été atteinte.

ENFILE

La limite du nombre total de fichiers ouverts pour le systÚme entier a été atteinte.

ENODEV

Impossible de monter (en interne) le pĂ©riphĂ©rique anonyme d’inƓud.

ENOMEM

Il n’y a pas assez de mĂ©moire pour que le noyau crĂ©e le nouveau descripteur de fichier eventfd.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3894810-1.png

VERSIONS

Différences entre bibliothÚque C et noyau

Il y a deux appels systĂšme sous-jacent : eventfd () et eventfd2 (), plus rĂ©cent. Le premier appel systĂšme n’implĂ©mente pas le paramĂštre flags . Le dernier appel systĂšme implĂ©mente les valeurs de flags dĂ©crite ci-dessus. La fonction enveloppe de la glibc utilisera eventfd2 () quand il est prĂ©sent.

Fonctionnalités supplémentaires de la glibc

La bibliothĂšque C de GNU dĂ©finie un type supplĂ©mentaire et deux fonctions qui tentent d’abstraire certains dĂ©tails pour la lecture ou l’écriture avec des descripteurs de fichier eventfd :

typedef uint64_t eventfd_t;
int eventfd_read(int fd, eventfd_t *value);
int eventfd_write(int fd, eventfd_t value);

Les fonctions effectuent des actions de lecture ou Ă©criture sur le descripteur de fichier eventfd, en renvoyant 0 si un nombre correct d’octets a Ă©tĂ© transfĂ©rĂ©, ou -1 sinon.

STANDARDS

Linux, GNU.

HISTORIQUE

eventfd ()

Linux 2.6.22, glibc 2.8.

eventfd2 ()

Linux 2.6.27 (consultez les VERSIONS). Depuis la glibc 2.9, la fonction enveloppe pour eventfd () utilise l’appel systùme eventfd2 () s’il est pris en charge par le noyau.

NOTES

Les applications peuvent utiliser un descripteur de fichier eventfd Ă  la place d’un tube (consultez pipe (2)) Ă  chaque fois qu’un tube est utilisĂ© pour signaler des Ă©vĂ©nements. La surcharge du noyau pour un descripteur de fichier est bien plus faible que pour un tube. De plus un seul descripteur de fichier est nĂ©cessaire (alors que deux sont nĂ©cessaires pour un tube).

Quand un descripteur de fichier eventfd est utilisĂ© par le noyau, il peut fournir un pont entre l’espace utilisateur et l’espace noyau. Par exemple, les fonctionnalitĂ©s comme KAIO (« kernel AIO ») pour signaler dans un descripteur de fichier que certaines opĂ©rations sont finies.

Un aspect important d’un descripteur de fichier eventfd est qu’il peut ĂȘtre surveillĂ© comme n’importe quel descripteur de fichier avec select (2), poll (2) ou epoll (7). Ceci signifie qu’une application peut surveiller simultanĂ©ment la disponibilitĂ© de fichiers « traditionnels » et la disponibilitĂ© de mĂ©canismes noyau qui gĂšrent une interface eventfd. (Sans l’interface eventfd (), ces mĂ©canismes ne pouvaient pas ĂȘtre multiplexĂ©s avec select (2), poll (2) ou epoll (7))

La valeur actuelle d’un compteur eventfd peut ĂȘtre visualisĂ©e avec l’entrĂ©e du descripteur de fichier correspondant dans le rĂ©pertoire /proc/ pid /fdinfo du processus. Voir proc (5) pour plus de dĂ©tails.

EXEMPLES

Le programme suivant crĂ©e un descripteur de fichier eventfd puis crĂ©e un processus fils. Alors que le pĂšre commence par s’endormir, le fils Ă©crit tous les entiers fournis sur la ligne de commande au descripteur de fichier eventfd. Quand le pĂšre se rĂ©veille, il lit dans le descripteur de fichier eventfd.

La session d’interprĂ©teur suivant montre un Ă©chantillon d’exĂ©cution du programme :

$ ./a.out 1 2 4 7 14
Écriture de l’enfant 1 dans efd
Écriture de l’enfant 2 dans efd
Écriture de l’enfant 4 dans efd
Écriture de l’enfant 7 dans efd
Écriture de l’enfant 14 dans efd
L’enfant a fini la boucle d’écriture
Parent sur le point de lire
Lecture du parent 28 (0x1c) depuis efd

Source du programme

#include <err.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/eventfd.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
int efd;
uint64_t u;
ssize_t s;
if (argc < 2) {
fprintf(stderr, "Utilisation : %s <num>...\n", argv[0]);
exit(EXIT_FAILURE);
}
efd = eventfd(0, 0);
if (efd == -1)
err(EXIT_FAILURE, "eventfd");
switch (fork()) {
case 0:
for (size_t j = 1; j < argc; j++) {
printf("Écriture de l’enfant %s dans efd\n", argv[j]);
u = strtoull(argv[j], NULL, 0);0
/* strtoull() autorise plusieurs bases bases */
s = write(efd, &u, sizeof(uint64_t));
if (s != sizeof(uint64_t))
err(EXIT_FAILURE,
}
printf("L’enfant a fini la boucle d’écriture\n");
exit(EXIT_SUCCESS);
default:
sleep(2);
printf(
s = read(efd, &u, sizeof(uint64_t));
if (s != sizeof(uint64_t))
err(EXIT_FAILURE, "read");
printf("Lecture du parent %"PRIu64" (%#"PRIx64") depuis efd\n", u, u);
exit(EXIT_SUCCESS);
case -1:
err(EXIT_FAILURE, "fork");
}
}

VOIR AUSSI

futex (2), pipe (2), poll (2), read (2), select (2), signalfd (2), timerfd_create (2), write (2), epoll (7), sem_overview (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.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@lists.debian.org .