C Academy · Lektion

Konfigurera epoll

Skapa och registrera en epoll-uppsättning.

Lektion 2 av 413 steg

Konfigurera epoll är en gratis lektion i C Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C Academy innehåller totalt 4 lektioner.

Skapa en epoll-instans

Allt börjar med en epoll-instans, som själv är en filbeskrivare. Skapa en med epoll_create1().

Argumentet är ett flaggfält. Ange 0 för standardbeteende eller EPOLL_CLOEXEC för att automatiskt stänga filbeskrivaren vid exec(). Det returnerade fd:t är det som skickas till alla andra epoll-anrop.

int epfd = epoll_create1(EPOLL_CLOEXEC);
if (epfd == -1) { perror("epoll_create1"); exit(1); }

epoll_create1 jämfört med epoll_create

Det äldre epoll_create(int size) tog emot en storleksanvisning, men kärnan ignorerar den numera. Det enda kravet var att värdet skulle vara positivt.

Föredra epoll_create1(): den tar flaggor i stället för en meningslös storlek och låter dig begära EPOLL_CLOEXEC atomiskt, så att ett separat fcntl()-anrop undviks.

/* legacy form, size arg ignored by kernel */
int epfd = epoll_create(1);

Strukturen epoll_event

Både intresse och resultat uttrycks med struct epoll_event. Den innehåller en bitmask för events och en union för data.

Unionen data innehåller det du vill få tillbaka när händelsen inträffar: vanligtvis data.fd, men den kan också innehålla en data.ptr som pekar på ett anslutningsobjekt du har allokerat.

struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listen_fd;

Registrera med EPOLL_CTL_ADD

epoll_ctl() hanterar intresselistan. Använd operationen EPOLL_CTL_ADD för att börja övervaka en filbeskrivare.

Du skickar epoll-fd:t, operationen, mål-fd:t och en pekare till din epoll_event. Därefter rapporterar epoll när filbeskrivaren är redo.

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");

Händelseflaggor: EPOLLIN och EPOLLOUT

Masken events anger vad du är intresserad av. EPOLLIN betyder att filbeskrivaren kan läsas; EPOLLOUT betyder att den kan skrivas till.

Vanligtvis övervakar du EPOLLIN på en lyssnande socket, för att kunna acceptera anslutningar, och på klientsockets, för att kunna läsa. Lägg bara till EPOLLOUT när du har buffrade data som inte skickades helt.

ev.events = EPOLLIN | EPOLLOUT;

Flaggor för fel och nedkoppling

Kärnan rapporterar alltid vissa tillstånd även om du inte begärde dem: EPOLLERR för fel, EPOLLHUP för nedkoppling och EPOLLRDHUP när motparten har stängt sin halva av anslutningen.

Kontrollera dessa i din hanterare. Om du ignorerar EPOLLHUP på en död socket kommer händelseloopen att snurra utan att komma vidare.

if (ev.events & (EPOLLERR | EPOLLHUP)) {
    close(ev.data.fd);
    continue;
}

Ändra intresset med EPOLL_CTL_MOD

När en filbeskrivare har registrerats kan du ändra dess händelsemask utan att ta bort den. Använd EPOLL_CTL_MOD.

Ett vanligt mönster är att en anslutning normalt bara övervakar EPOLLIN, sedan växlar till EPOLLIN | EPOLLOUT när sändningsbufferten blir full och växlar tillbaka när den har tömts.

ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_fd;
epoll_ctl(epfd, EPOLL_CTL_MOD, conn_fd, &ev);

Ta bort med EPOLL_CTL_DEL

När en anslutning stängs slutar du att övervaka den med EPOLL_CTL_DEL. Det sista argumentet av typen epoll_event ignoreras och kan vara NULL i moderna kärnor.

Observera att en filbeskrivare automatiskt tas bort från alla epoll-intresselistor när den stängs, men en uttrycklig borttagning före stängningen gör bokföringen tydligare.

epoll_ctl(epfd, EPOLL_CTL_DEL, conn_fd, NULL);
close(conn_fd);

Nivåtriggad jämfört med flanktriggad

Som standard är epoll nivåtriggat: så länge en filbeskrivare förblir läsbar rapporterar varje epoll_wait() den. Det är förlåtande och enkelt.

Lägg till flaggan EPOLLET för flanktriggat läge: du meddelas bara när beredskapen ändras, så du måste tömma socketen helt i en loop tills EAGAIN returneras.

ev.events = EPOLLIN | EPOLLET;  /* edge-triggered */
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);

Lagra en kontextpekare

I stället för data.fd kan du lagra data.ptr, som pekar på en struktur för den enskilda anslutningen. När händelsen inträffar får du tillbaka pekaren direkt, utan att behöva någon uppslagstabell.

Kom bara ihåg att det är en union: om du anger data.ptr kan du inte samtidigt läsa data.fd från samma händelse.

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

Rensa upp

epoll-instansen är bara en filbeskrivare, så du frigör den med close() när servern stängs av.

När epoll-fd:t stängs frigörs kärnans intresselista. Övervakade sockets som fortfarande är öppna förblir öppna; stäng dem separat för att frigöra deras resurser.

close(epfd);

Snabbtest

Testa hur väl du förstår API:t för att konfigurera epoll.

Sammanfattning

Du skapar en instans med epoll_create1() och hanterar sedan intresset via epoll_ctl() med ADD, MOD och DEL. Varje struct epoll_event innehåller en mask för events och en union för data.

Välj nivåtriggning för enkelhetens skull eller EPOLLET för prestanda med flanktriggning. Därefter använder vi dessa delar i en händelseloop.

Gratis att börja

Lär dig C med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
144

Vanliga frågor

Är lektionen ”Konfigurera epoll” gratis?

Ja – hela texten till ”Konfigurera epoll” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Konfigurera epoll”?

Skapa och registrera en epoll-uppsättning. Ni övar på C Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C Academy?

Du behöver inga förkunskaper. Utbildningen i C Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Konfigurera epoll”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C Academy-lektionen?

Ja. Varje C Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Blockerande kontra icke-blockerande I/O
  2. Konfigurera epoll
  3. Händelseloopen
  4. En enkel echo-server
← Tillbaka till C Academy