epoll instellen
Maak een epoll-set en registreer die.
epoll instellen is een gratis C Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C Academy bevat in totaal 4 lessen.
Een epoll-instantie maken
Alles begint met een epoll-instantie, die zelf een bestandsdescriptor is. Maak er een met epoll_create1().
Het argument is een vlaggenveld; geef 0 door voor standaardgedrag of EPOLL_CLOEXEC om de descriptor automatisch te sluiten bij exec(). De geretourneerde fd geef je door aan elke andere epoll-aanroep.
int epfd = epoll_create1(EPOLL_CLOEXEC);
if (epfd == -1) { perror("epoll_create1"); exit(1); }epoll_create1 versus epoll_create
De oudere epoll_create(int size) nam een aanwijzing voor de grootte aan, maar de kernel negeert die nu; de enige vereiste was dat de waarde positief was.
Gebruik bij voorkeur epoll_create1(): deze functie gebruikt vlaggen in plaats van een betekenisloze grootte en laat je atomair om EPOLL_CLOEXEC vragen, zodat een aparte aanroep van fcntl() niet nodig is.
/* legacy form, size arg ignored by kernel */
int epfd = epoll_create(1);De struct epoll_event
Zowel de gewenste gebeurtenissen als de resultaten worden uitgedrukt met struct epoll_event. Deze bevat een bitmasker events en een union data.
De union data bevat wat je terug wilt krijgen wanneer de gebeurtenis optreedt: meestal data.fd, maar het kan ook een data.ptr zijn naar een verbindingsobject dat je hebt toegewezen.
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listen_fd;Registreren met EPOLL_CTL_ADD
epoll_ctl() beheert de lijst met gewenste gebeurtenissen. Gebruik de bewerking EPOLL_CTL_ADD om een descriptor te gaan bewaken.
Je geeft de epoll-fd, de bewerking, de doel-fd en een pointer naar je epoll_event door. Daarna rapporteert epoll wanneer die descriptor gereed is.
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");Gebeurtenisvlaggen: EPOLLIN en EPOLLOUT
Het masker events geeft aan waarin je geïnteresseerd bent. EPOLLIN betekent dat de descriptor leesbaar is; EPOLLOUT betekent dat deze beschrijfbaar is.
Meestal bewaak je EPOLLIN op een luistersocket (om verbindingen te accepteren) en op clientsockets (om te lezen). Voeg EPOLLOUT alleen toe wanneer je gebufferde gegevens hebt die niet volledig zijn verzonden.
ev.events = EPOLLIN | EPOLLOUT;Vlaggen voor fouten en verbreking
De kernel rapporteert bepaalde omstandigheden altijd, ook als je er niet om hebt gevraagd: EPOLLERR voor fouten, EPOLLHUP voor een verbreking en EPOLLRDHUP wanneer de peer de verbinding aan zijn kant gedeeltelijk sluit.
Controleer deze in je handler; als je EPOLLHUP op een dode socket negeert, blijft de gebeurtenislus onnodig draaien.
if (ev.events & (EPOLLERR | EPOLLHUP)) {
close(ev.data.fd);
continue;
}Gewenste gebeurtenissen wijzigen met EPOLL_CTL_MOD
Zodra een descriptor is geregistreerd, kun je het gebeurtenismasker wijzigen zonder de descriptor te verwijderen. Gebruik daarvoor EPOLL_CTL_MOD.
Een veelgebruikt patroon: een verbinding bewaakt normaal alleen EPOLLIN en schakelt over naar EPOLLIN | EPOLLOUT wanneer de verzendbuffer vol raakt, om daarna weer terug te schakelen zodra de buffer leeg is.
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_fd;
epoll_ctl(epfd, EPOLL_CTL_MOD, conn_fd, &ev);Verwijderen met EPOLL_CTL_DEL
Wanneer een verbinding wordt gesloten, stop je met het bewaken ervan met EPOLL_CTL_DEL. Het laatste argument van het type epoll_event wordt genegeerd en mag op moderne kernels NULL zijn.
Let op: als je een descriptor sluit, wordt deze automatisch uit alle epoll-lijsten met gewenste gebeurtenissen verwijderd. Toch houdt expliciet verwijderen vóór het sluiten je administratie overzichtelijk.
epoll_ctl(epfd, EPOLL_CTL_DEL, conn_fd, NULL);
close(conn_fd);Niveaugestuurd versus flankgestuurd
Standaard is epoll niveaugestuurd: zolang een descriptor leesbaar blijft, rapporteert elke epoll_wait()-aanroep deze. Dat is vergevingsgezind en eenvoudig.
Voeg de vlag EPOLLET toe voor de flankgestuurde modus: je krijgt alleen een melding wanneer de gereedheid verandert. Daarom moet je de socket in een lus volledig leeglezen tot EAGAIN.
ev.events = EPOLLIN | EPOLLET; /* edge-triggered */
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);Een contextpointer opslaan
In plaats van data.fd kun je data.ptr opslaan, die naar een struct per verbinding wijst. Wanneer de gebeurtenis optreedt, krijg je die pointer direct terug en heb je geen opzoektabel nodig.
Vergeet de union niet: als je data.ptr instelt, kun je niet ook data.fd uit dezelfde gebeurtenis lezen.
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);Opruimen
De epoll-instantie is gewoon een bestandsdescriptor, dus geef je deze vrij met close() wanneer de server wordt afgesloten.
Door de epoll-fd te sluiten, maakt de kernel de lijst met gewenste gebeurtenissen vrij. Eventuele nog geopende bewaakte sockets blijven open; sluit die afzonderlijk om hun resources vrij te geven.
close(epfd);Korte controle
Test hoe goed je de API voor het instellen van epoll beheerst.
Samenvatting
Je maakt een instantie met epoll_create1() en beheert daarna de gewenste gebeurtenissen via epoll_ctl() met ADD, MOD en DEL. Elke struct epoll_event bevat een masker events en een union data.
Kies niveaugestuurde verwerking voor eenvoud of EPOLLET voor flankgestuurde prestaties. Vervolgens gebruiken we deze onderdelen vanuit een gebeurtenislus.
Leer C met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 39
- Lessen
- 144
Veelgestelde vragen
Is de les “epoll instellen” gratis?
Ja — de volledige tekst van “epoll instellen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C Academy bevat in totaal 4 lessen.
Wat leer ik in “epoll instellen”?
Maak een epoll-set en registreer die. Je oefent met C Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C Academy te beginnen?
Ervaring vooraf is niet nodig. C Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “epoll instellen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C Academy?
Ja. Elke les over C Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.