Configurer epoll
Créez et enregistrez un ensemble epoll.
Configurer epoll est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C Academy comprend 4 leçons au total.
Créer une instance epoll
Tout commence par une instance epoll, qui est elle-même un descripteur de fichier. Créez-en une avec epoll_create1().
L’argument est un champ d’indicateurs : transmettez 0 pour le comportement par défaut ou EPOLL_CLOEXEC pour fermer automatiquement le descripteur lors d’un exec(). Le descripteur renvoyé est celui que vous transmettez à tous les autres appels epoll.
int epfd = epoll_create1(EPOLL_CLOEXEC);
if (epfd == -1) { perror("epoll_create1"); exit(1); }epoll_create1 contre epoll_create
L’ancienne fonction epoll_create(int size) acceptait une indication de taille, mais le noyau l’ignore désormais : la seule exigence était qu’elle soit positive.
Préférez epoll_create1() : elle prend des indicateurs plutôt qu’une taille dépourvue de sens et vous permet de demander EPOLL_CLOEXEC de manière atomique, ce qui évite un appel fcntl() distinct.
/* legacy form, size arg ignored by kernel */
int epfd = epoll_create(1);La structure epoll_event
Les événements surveillés et les résultats sont tous deux représentés par struct epoll_event. Cette structure contient un masque de bits events et une union data.
L’union data contient ce que vous souhaitez récupérer lorsque l’événement se produit : généralement data.fd, mais il peut aussi s’agir d’un data.ptr pointant vers un objet de connexion que vous avez alloué.
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listen_fd;Enregistrer avec EPOLL_CTL_ADD
epoll_ctl() gère la liste des événements surveillés. Utilisez l’opération EPOLL_CTL_ADD pour commencer à surveiller un descripteur.
Vous transmettez le descripteur epoll, l’opération, le descripteur cible et un pointeur vers votre epoll_event. Ensuite, epoll signale que ce descripteur est prêt.
struct epoll_event ev = { .events = EPOLLIN, .data.fd = listen_fd };
if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ev) == -1)
perror("epoll_ctl: add");Indicateurs d’événement : EPOLLIN et EPOLLOUT
Le masque events indique ce qui vous intéresse. EPOLLIN signifie que le descripteur est lisible ; EPOLLOUT signifie qu’il est accessible en écriture.
Vous surveillez généralement EPOLLIN sur une socket d’écoute (pour accepter les connexions) et sur les sockets clientes (pour lire). N’ajoutez EPOLLOUT que lorsque des données mises en tampon n’ont pas été entièrement envoyées.
ev.events = EPOLLIN | EPOLLOUT;Indicateurs d’erreur et de raccrochage
Le noyau signale toujours certaines conditions, même si vous ne les avez pas demandées : EPOLLERR pour les erreurs, EPOLLHUP pour un raccrochage et EPOLLRDHUP pour une fermeture de moitié par le pair.
Vérifiez ces indicateurs dans votre gestionnaire : ignorer EPOLLHUP sur une socket inactive provoque une boucle incessante dans la boucle d’événements.
if (ev.events & (EPOLLERR | EPOLLHUP)) {
close(ev.data.fd);
continue;
}Modifier les événements surveillés avec EPOLL_CTL_MOD
Une fois un descripteur enregistré, vous pouvez modifier son masque d’événements sans le supprimer. Utilisez EPOLL_CTL_MOD.
Un schéma courant consiste à ne surveiller normalement que EPOLLIN pour une connexion, puis à passer à EPOLLIN | EPOLLOUT lorsque son tampon d’envoi se remplit, avant de revenir au mode précédent une fois le tampon vidé.
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_fd;
epoll_ctl(epfd, EPOLL_CTL_MOD, conn_fd, &ev);Supprimer avec EPOLL_CTL_DEL
Lorsqu’une connexion se ferme, cessez de la surveiller avec EPOLL_CTL_DEL. Le dernier argument epoll_event est ignoré et peut être NULL avec les noyaux modernes.
Notez que la fermeture d’un descripteur le supprime automatiquement de toutes les listes d’événements epoll, mais une suppression explicite avant la fermeture rend votre suivi plus clair.
epoll_ctl(epfd, EPOLL_CTL_DEL, conn_fd, NULL);
close(conn_fd);Déclenchement par niveau contre déclenchement par front
Par défaut, epoll utilise un déclenchement par niveau : tant qu’un descripteur reste lisible, chaque appel à epoll_wait() le signale. Ce mode est tolérant et facile à utiliser.
Ajoutez l’indicateur EPOLLET pour le mode à déclenchement par front : vous n’êtes averti que lorsque l’état de préparation change. Vous devez donc vider complètement la socket dans une boucle jusqu’à obtenir EAGAIN.
ev.events = EPOLLIN | EPOLLET; /* edge-triggered */
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);Stocker un pointeur de contexte
Au lieu de data.fd, vous pouvez stocker data.ptr pointant vers une structure propre à chaque connexion. Lorsque l’événement se produit, vous récupérez directement ce pointeur, sans table de recherche.
N’oubliez pas qu’il s’agit d’une union : si vous définissez data.ptr, vous ne pouvez pas également lire data.fd dans le même événement.
struct conn *c = malloc(sizeof *c);
c->fd = conn_fd;
ev.events = EPOLLIN;
ev.data.ptr = c;
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);Nettoyer les ressources
L’instance epoll est simplement un descripteur de fichier : vous la libérez avec close() lorsque le serveur s’arrête.
La fermeture du descripteur epoll libère la liste des événements surveillés du noyau. Les sockets surveillées qui sont encore ouvertes restent ouvertes : fermez-les séparément pour libérer leurs ressources.
close(epfd);Vérification rapide
Vérifiez votre compréhension de l’interface de configuration d’epoll.
Récapitulatif
Vous créez une instance avec epoll_create1(), puis gérez les événements surveillés avec epoll_ctl() à l’aide de ADD, MOD et DEL. Chaque struct epoll_event contient un masque events et une union data.
Choisissez le déclenchement par niveau pour privilégier la simplicité, ou EPOLLET pour les performances du déclenchement par front. Nous allons maintenant utiliser ces éléments dans une boucle d’événements.
Apprends C avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 39
- Leçons
- 144
Questions Fréquemment Posées
La leçon « Configurer epoll » est-elle gratuite ?
Oui — le texte complet de « Configurer epoll » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C Academy, passe à CoddyKit PRO. Le cours C Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Configurer epoll » ?
Créez et enregistrez un ensemble epoll. Tu pratiques C Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C Academy ?
Aucune expérience préalable n'est requise. C Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Configurer epoll » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C Academy ?
Oui. Chaque leçon C Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.