epollin käyttöönotto
Luokaa ja rekisteröikää epoll-joukko.
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.
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
- Estävä ja ei-estävä I/O
- epollin käyttöönotto
- Tapahtumasilmukka
- Yksinkertainen kaikupalvelin