C Academy · Oppitunti

epollin käyttöönotto

Luokaa ja rekisteröikää epoll-joukko.

Oppitunti 2/413 vaihetta

epollin käyttöönotto on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

epoll-instanssin luominen

Kaikki alkaa epoll-instanssista, joka on itsessään tiedostokuvaaja. Luokaa se funktiolla epoll_create1().

Argumentti on lippukenttä: välittäkää 0 oletustoimintaa varten tai EPOLL_CLOEXEC, jos haluatte sulkea tiedostokuvaajan automaattisesti exec()-kutsun yhteydessä. Palautuva fd on tiedostokuvaaja, joka välitetään kaikkiin muihin epoll-kutsuihin.

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

epoll_create1 ja epoll_create

Vanhempi epoll_create(int size) hyväksyi kokoa koskevan vihjeen, mutta ydin ohittaa sen nykyään; ainoa vaatimus oli, että arvo on positiivinen.

Suosikaa epoll_create1()-funktiota: se hyväksyy merkityksettömän koon sijaan liput ja mahdollistaa EPOLL_CLOEXEC-asetuksen pyytämisen atomisesti, jolloin erillistä fcntl()-kutsua ei tarvita.

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

epoll_event-rakenne

Kiinnostuksen kohteet ja tulokset ilmaistaan struct epoll_event-rakenteen kautta. Se sisältää events-bittimaskin ja data-unionin.

data-union sisältää tiedot, jotka haluatte palautettavan tapahtuman toteutuessa: yleensä data.fd-arvon, mutta se voi sisältää myös varaamaanne yhteysobjektiin osoittavan data.ptr-osoittimen.

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

Rekisteröinti EPOLL_CTL_ADD-toiminnolla

epoll_ctl() hallinnoi kiinnostuslistaa. Aloittakaa tiedostokuvaajan valvonta käyttämällä EPOLL_CTL_ADD-toimintoa.

Välitätte epoll-tiedostokuvaajan, toiminnon, kohdetiedostokuvaajan ja osoittimen epoll_event-rakenteeseen. Tämän jälkeen epoll ilmoittaa kyseisen tiedostokuvaajan valmiudesta.

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

Tapahtumaliput: EPOLLIN ja EPOLLOUT

events-maski ilmaisee, mistä olette kiinnostuneita. EPOLLIN tarkoittaa, että tiedostokuvaaja on luettavissa; EPOLLOUT tarkoittaa, että siihen voidaan kirjoittaa.

Yleensä valvotte EPOLLIN-tilaa kuuntelevassa socketissa hyväksyäksenne yhteydet ja asiakassocketeissa lukeaksenne dataa. Lisätkää EPOLLOUT vain, kun teillä on puskurissa dataa, jota ei ole lähetetty kokonaan.

ev.events = EPOLLIN | EPOLLOUT;

Virhe- ja katkaisuliput

Ydin ilmoittaa tietyistä tilanteista aina, vaikka ette olisi pyytäneet niitä: EPOLLERR virheistä, EPOLLHUP yhteyden katkeamisesta ja EPOLLRDHUP vertaispään puolittaisesta sulkemisesta.

Tarkistakaa nämä käsittelijässänne. EPOLLHUP-lipun huomiotta jättäminen suljetussa socketissa saa tapahtumasilmukan pyörimään jatkuvasti.

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

Kiinnostuksen muuttaminen EPOLL_CTL_MOD-toiminnolla

Kun tiedostokuvaaja on rekisteröity, voitte muuttaa sen tapahtumamaskia poistamatta sitä. Käyttäkää EPOLL_CTL_MOD-toimintoa.

Yleinen toimintamalli on, että yhteys valvoo normaalisti vain EPOLLIN-tilaa, vaihtaa tilaan EPOLLIN | EPOLLOUT, kun sen lähetyspuskuri täyttyy, ja palaa takaisin, kun puskuri on tyhjennetty.

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

Poistaminen EPOLL_CTL_DEL-toiminnolla

Kun yhteys sulkeutuu, lopettakaa sen valvonta käyttämällä EPOLL_CTL_DEL-toimintoa. Viimeinen epoll_event-argumentti ohitetaan, ja se voi olla NULL nykyaikaisissa ytimissä.

Huomioikaa, että tiedostokuvaajan sulkeminen poistaa sen automaattisesti kaikista epoll-kiinnostuslistoista. Eksplisiittinen poistaminen ennen sulkemista pitää kuitenkin kirjanpidon selkeänä.

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

Tasot laukaiseva ja reunat laukaiseva tila

Oletusarvoisesti epoll käyttää tasot laukaisevaa tilaa: niin kauan kuin tiedostokuvaaja pysyy luettavana, jokainen epoll_wait()-kutsu ilmoittaa siitä. Tämä on joustava ja helppo tapa toimia.

Lisätkää EPOLLET-lippu, jos haluatte reunat laukaisevan tilan: ilmoitus annetaan vain valmiuden muuttuessa, joten socket on tyhjennettävä kokonaan silmukassa, kunnes saadaan EAGAIN.

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

Kontekstiosoittimen tallentaminen

data.fd-arvon sijaan voitte tallentaa data.ptr-osoittimen, joka osoittaa yhteyskohtaiseen struct-rakenteeseen. Kun tapahtuma toteutuu, saatte osoittimen suoraan takaisin ilman hakutaulukkoa.

Muistakaa kuitenkin, että kyseessä on union: jos asetatte data.ptr-arvon, ette voi samalla lukea data.fd-arvoa samasta tapahtumasta.

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

Siivous

epoll-instanssi on vain tiedostokuvaaja, joten vapauttakaa se palvelimen sammuessa kutsumalla close()-funktiota.

epoll-tiedostokuvaajan sulkeminen vapauttaa ytimen kiinnostuslistan. Kaikki yhä avoinna olevat valvotut socketit pysyvät avoinna; sulkekaa ne erikseen resurssien vapauttamiseksi.

close(epfd);

Pikatarkistus

Testatkaa, miten hyvin hallitsette epoll-asennukseen liittyvän API:n.

Kertaus

Luotte instanssin funktiolla epoll_create1() ja hallinnoitte sen jälkeen kiinnostusta funktion epoll_ctl() avulla käyttäen ADD-, MOD- ja DEL-toimintoja. Jokainen struct epoll_event sisältää events-maskin ja data-unionin.

Valitkaa tasot laukaiseva tila helppoutta varten tai EPOLLET reunat laukaisevaa suorituskykyä varten. Seuraavaksi ohjaamme näitä osia tapahtumasilmukasta.

Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”epollin käyttöönotto” ilmainen?

Kyllä – oppitunnin ”epollin käyttöönotto” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”epollin käyttöönotto”?

Luokaa ja rekisteröikää epoll-joukko. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”epollin käyttöönotto”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Estävä ja ei-estävä I/O
  2. epollin käyttöönotto
  3. Tapahtumasilmukka
  4. Yksinkertainen kaikupalvelin
← Takaisin: C Academy