.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2008 Michael Kerrisk .\" starting from a version by Davide Libenzi .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\" 2008-10-10, mtk: describe eventfd2(), and EFD_NONBLOCK and EFD_CLOEXEC .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH eventfd 2 "2 mai 2024" "Pages du manuel de Linux 6.8" .SH NOM eventfd \- Créer un descripteur de fichier pour la notification d'événements .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .P \fBint eventfd(unsigned int \fP\fIinitval\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH DESCRIPTION \fBeventfd\fP() 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 (\fIuint64_t\fP) qui est maintenu par le noyau. Ce compteur est initialisé à la valeur spécifiée par le paramètre \fIinitval\fP. .P Comme valeur de retour, \fBeventfd\fP() renvoie un nouveau descripteur de fichier qui peut être utilisé pour se référer à l'objet eventfd. .P Les valeurs suivantes peuvent être incluses (avec un OU logique) dans \fIflags\fP pour changer le comportement de \fBeventfd\fP() : .TP \fBEFD_CLOEXEC\fP (depuis Linux 2.6.27) Placer l'attribut « close\-on\-exec » (\fBFD_CLOEXEC\fP) sur le nouveau descripteur de fichier. Consultez la description de l'attribut \fBO_CLOEXEC\fP dans \fBopen\fP(2) pour savoir pourquoi cela peut être utile. .TP \fBEFD_NONBLOCK\fP (depuis Linux 2.6.27) Placer l'attribut d'état de fichier \fBO_NONBLOCK\fP sur la description du fichier ouvert référencée par le nouveau descripteur de fichier (consulter \fBopen\fP(2)). Utiliser cet attribut économise des appels supplémentaires à \fBfcntl\fP(2) pour obtenir le même résultat. .TP \fBEFD_SEMAPHORE\fP (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. .P Jusqu'à Linux 2.6.26, le paramètre \fIflags\fP n'est pas utilisé et doit valoir zéro. .P Les opérations suivantes peuvent être effectuées sur le descripteur de fichier renvoyé par \fBeventfd\fP() : .TP \fBread\fP(2) Chaque \fBread\fP(2) qui réussit renvoie un entier sur 8 octets. \fBread\fP(2) échouera avec l'erreur \fBEINVAL\fP si la taille du tampon fourni est de moins de 8 octets. .IP La valeur renvoyée par \fBread\fP(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. .IP La sémantique de \fBread\fP(2) dépend du fait que le compteur eventfd a actuellement une valeur non nulle, et que l'attribut \fBEFD_SEMAPHORE\fP était spécifié lors de la création du descripteur de fichier eventfd : .RS .IP \- 3 Si \fBEFD_SEMAPHORE\fP n'était pas spécifié et si le compteur eventfd a une valeur non nulle, un \fBread\fP(2) renverra 8 octets contenant cette valeur, et la valeur du compteur sera remise à zéro. .IP \- Si \fBEFD_SEMAPHORE\fP était spécifié et si le compteur eventfd a une valeur non nulle, un \fBread\fP(2) renverra 8 octets contenant la valeur 1, et la valeur du compteur sera décrémentée de 1. .IP \- Si le compteur eventfd est nul au moment de l'appel à \fBread\fP(2), l'appel bloquera jusqu'à ce que le compteur devienne non nul (auquel cas l'appel à \fBread\fP(2) sera traité comme décrit ci\-dessus), ou échouera avec l'erreur \fBEAGAIN\fP si le descripteur de fichier est en mode non bloquant. .RE .TP \fBwrite\fP(2) Un appel à \fBwrite\fP(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 \fBwrite\fP(2) bloquera jusqu'à ce qu'un \fBread\fP(2) soit effectué sur le descripteur de fichier, ou échouera avec l'erreur \fBEAGAIN\fP si le descripteur de fichier est en mode non bloquant. .IP Un \fBwrite\fP(2) échouera avec l'erreur \fBEINVAL\fP si la taille du tampon fourni est de moins de 8 octets ou si l'on essaie d'écrire la valeur 0xffffffffffffffff. .TP \fBpoll\fP(2) .TQ \fBselect\fP(2) .TQ (et similaire) Le descripteur de fichier prend en charge les \fBpoll\fP(2) (et de façon analogue \fBepoll\fP(7)) et \fBselect\fP(2) de la façon suivante : .RS .IP \- 3 Le descripteur de fichier est lisible (le paramètre \fIreadfds\fP de \fBselect\fP(2) ; l'attribut \fBPOLLIN\fP de \fBpoll\fP(2)) si le compteur a une valeur supérieure à 0. .IP \- Le descripteur de fichier est disponible en écriture (le paramètre \fIwritefds\fP de \fBselect\fP(2) ; l'attribut \fBPOLLOUT\fP de \fBpoll\fP(2)) s'il est possible d'écrire une valeur d'au moins « 1 » sans bloquer. .IP \- Si un dépassement de la valeur du compteur a été détectée, \fBselect\fP(2) indique que le descripteur de fichier est disponible en lecture et en écriture et \fBpoll\fP(2) renvoie un événement \fBPOLLERR\fP. Comme indiquée ci\-dessus, un \fBwrite\fP(2) ne peut jamais produire de dépassement. Cependant, un dépassement peut se produire si un « signal post » eventfd de 2\[ha]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 \fBread\fP(2) renverra la valeur maximale d'un \fIuint64_t\fP (c'est\-à\-dire 0xffffffffffffffff). .RE .IP Le descripteur de fichier eventfd prend également en charge les autres interfaces de multiplexage de descripteurs de fichier : \fBpselect\fP(2) et \fBppoll\fP(2). .TP \fBclose\fP(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. .P Une copie d'un descripteur de fichier créé par \fBeventfd\fP() est héritée par le fils produit par \fBfork\fP(2). Le duplicata du descripteur de fichier est associé au même objet eventfd. Les descripteurs de fichier créés par \fBeventfd\fP() sont préservés au travers des exécutions par \fBexecve\fP(2), sauf si l'attribut «\ close\(hyon\(hyexec\ » est positionné. .SH "VALEUR RENVOYÉE" S'il réussit, \fBeventfd\fP() renvoie un nouveau descripteur de fichier eventfd. En cas d'erreur, il renvoie \-1 et remplit \fIerrno\fP avec la valeur d'erreur. .SH ERREURS .TP \fBEINVAL\fP Une valeur non prise en compte a été spécifiée dans \fIflags\fP. .TP \fBEMFILE\fP La limite du nombre de descripteurs de fichiers par processus a été atteinte. .TP \fBENFILE\fP La limite du nombre total de fichiers ouverts pour le système entier a été atteinte. .TP \fBENODEV\fP .\" Note from Davide: .\" The ENODEV error is basically never going to happen if .\" the kernel boots correctly. That error happen only if during .\" the kernel initialization, some error occur in the anonymous .\" inode source initialization. Impossible de monter (en interne) le périphérique anonyme d'inœud. .TP \fBENOMEM\fP Il n'y a pas assez de mémoire pour que le noyau crée le nouveau descripteur de fichier eventfd. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interface Attribut Valeur T{ .na .nh \fBeventfd\fP() T} Sécurité des threads MT\-Safe .TE .SH VERSIONS .SS "Différences entre bibliothèque C et noyau" Il y a deux appels système sous\-jacent : \fBeventfd\fP() et \fBeventfd2\fP(), plus récent. Le premier appel système n'implémente pas le paramètre \fIflags\fP. Le dernier appel système implémente les valeurs de \fIflags\fP décrite ci\-dessus. La fonction enveloppe de la glibc utilisera \fBeventfd2\fP() quand il est présent. .SS "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 : .P .in +4n .EX typedef uint64_t eventfd_t; \& int eventfd_read(int fd, eventfd_t *value); int eventfd_write(int fd, eventfd_t value); .EE .in .P 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. .SH STANDARDS Linux, GNU. .SH HISTORIQUE .TP \fBeventfd\fP() .\" eventfd() is in glibc 2.7, but reportedly does not build Linux 2.6.22, glibc 2.8. .TP \fBeventfd2\fP() Linux 2.6.27 (consultez les VERSIONS). Depuis la glibc 2.9, la fonction enveloppe pour \fBeventfd\fP() utilise l'appel système \fBeventfd2\fP() s'il est pris en charge par le noyau. .SH NOTES Les applications peuvent utiliser un descripteur de fichier eventfd à la place d'un tube (consultez \fBpipe\fP(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). .P .\" or eventually syslets/threadlets 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. .P Un aspect important d'un descripteur de fichier eventfd est qu'il peut être surveillé comme n'importe quel descripteur de fichier avec \fBselect\fP(2), \fBpoll\fP(2) ou \fBepoll\fP(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 \fBeventfd\fP(), ces mécanismes ne pouvaient pas être multiplexés avec \fBselect\fP(2), \fBpoll\fP(2) ou \fBepoll\fP(7)) .P La valeur actuelle d'un compteur eventfd peut être visualisée avec l'entrée du descripteur de fichier correspondant dans le répertoire \fI/proc/\fPpid\fI/fdinfo\fP du processus. Voir \fBproc\fP(5) pour plus de détails. .SH 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. .P La session d'interpréteur suivant montre un échantillon d'exécution du programme : .P .in +4n .EX $\fB ./a.out 1 2 4 7 14\fP É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 .EE .in .SS "Source du programme" .\" SRC BEGIN (eventfd.c) \& .EX #include #include #include #include #include #include #include \& int main(int argc, char *argv[]) { int efd; uint64_t u; ssize_t s; \& if (argc < 2) { fprintf(stderr, "Utilisation : %s ...\en", 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\\en", argv[j]); u = strtoull(argv[j], NULL, 0);\n" /* strtoull() autorise plusieurs bases bases */ s = write(efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) err(EXIT_FAILURE, \"write\"); } printf("L'enfant a fini la boucle d'écriture\en"); \& exit(EXIT_SUCCESS); \& default: sleep(2); \& printf(\"Parent sur le point de lire\en"); s = read(efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) err(EXIT_FAILURE, "read"); printf("Lecture du parent %"PRIu64" (%#"PRIx64") depuis efd\en", u, u); exit(EXIT_SUCCESS); \& case \-1: err(EXIT_FAILURE, "fork"); } } .EE .\" SRC END .SH "VOIR AUSSI" \fBfutex\fP(2), \fBpipe\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBselect\fP(2), \fBsignalfd\fP(2), \fBtimerfd_create\fP(2), \fBwrite\fP(2), \fBepoll\fP(7), \fBsem_overview\fP(7) .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Cédric Boutillier , Frédéric Hantrais et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .