eventfd | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
L'argument flags n'est actuellement pas utilisé et doit être spécifié à zéro. Dans le futur, il pourrait être utilisé pour des fonctionnalités supplémentaires.
Comme valeur de retour, eventfd() renvoie un nouveau descripteur de fichiers qui peut être utilisé pour faire référence à l'objet eventfd. Les opérations suivantes peuvent être effectuées sur le descripteur de fichiers :
Une copie du descripteur de fichiers créé par eventfd() est hérité par le fils produit par fork(2). Le descripteur de fichiers dupliqué est associé au même objet eventfd. Les descripteurs de fichiers créés par eventfd() sont préservés à travers un execve(2).
VALEUR RENVOYÉE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
ERREURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
VERSIONS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Le temps d'inactivité noyau (Ndt : kernel overhead) d'un descripteur de fichiers est plus court que celui d'un tube et seulement un descripteur de fichiers est nécessaire (contrairement aux deux nécessaires pour un tube).
Lorsqu'il est utilisé dans le noyau, un descripteur de fichiers eventfd peut fournir un pont entre le noyau et l'espace utilisateur permettant, par exemple, à des fonctionnalités comme KAIO (kernel AIO) de signaler à un descripteur de fichiers que certaines opérations sont achevées.
Un point clé à propos des descripteurs de fichiers est qu'ils peuvent être surveillés comme tout autre descripteur de fichiers avec select(2), poll(2) ou epoll(7). Cela signifie qu'une application peut surveiller simultanément la disponibilité de fichiers « traditionnels » et la disponibilité d'autres mécanismes du noyau qui prennent en charge l'interface eventfd. (Sans l'interface eventfd(), ces mécanismes ne pourraient pas être multiplexés via select(2), poll(2) ou epoll(7).)
L'argument flags est un ajout de la glibc à l'appel système sous-jacent qui ne prend que l'argument initval.
Fonctionnalités supplémentaires de la glibc | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
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 opérations de lecture et d'écriture sur un descripteur de fichiers, renvoyant 0 si le nombre correct d'octets a été transféré ou -1 autrement.
EXEMPLE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Le programme suivant crée un descripteur de fichier et se clone pour créer un processus fils. Pendant que le parent sommeille brièvement, le fils écrit chacun des entiers fournis dans les arguments de la ligne de commande du programme dans le descripteur de fichiers eventfd. Lorsque le parent sort de son sommeil, il lit le descripteur de fichiers eventfd.
La session shell suivante montre un exemple de l'exécution du programme :
$ ./a.out 1 2 4 7 14 Child writing 1 to efd Child writing 2 to efd Child writing 4 to efd Child writing 7 to efd Child writing 14 to efd Child completed write loop Parent about to read Parent read 28 (0x1c) from efd
#include <sys/eventfd.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <stdint.h> /* Definition of uint64_t */ #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { int efd, j; uint64_t u; ssize_t s; if (argc < 2) { fprintf(stderr, "Usage: %s <num>...\n", argv[0]); exit(EXIT_FAILURE); } efd = eventfd(0, 0); if (efd == -1) handle_error("eventfd"); switch (fork()) { case 0: for (j = 1; j < argc; j++) { printf("Child writing %s to efd\n", argv[j]); u = strtoull(argv[j], NULL, 0); /* strtoull() allows various bases */ s = write(efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error("write"); } printf("Child completed write loop\n"); exit(EXIT_SUCCESS); default: sleep(2); printf("Parent about to read\n"); s = read(efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error("read"); printf("Parent read %llu (0x%llx) from efd\n", (unsigned long long) u, (unsigned long long) u); exit(EXIT_SUCCESS); case -1: handle_error("fork"); } }
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 23 avril 2008 et révisée le 24 avril 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 eventfd ». 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 |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
close(2) | DESCRIPTION |
EINVAL | ERREURS |
EMFILE | ERREURS |
ENFILE | ERREURS |
ENODEV | ERREURS |
ENOMEM | ERREURS |
poll(2), select(2) (et semblables) | DESCRIPTION |
read(2) | DESCRIPTION |
write(2) | DESCRIPTION |