Konfigurera epoll
Skapa och registrera en epoll-uppsättning.
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.
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.