0Pricing
C Academy · Ders

epoll Kurulumu

Bir epoll kümesi oluşturup kaydedin.

epoll Kurulumu, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

epoll Örneği Oluşturma

Her şey, kendisi de bir dosya tanımlayıcısı olan bir epoll örneğiyle başlar. Bir örnek oluşturmak için epoll_create1() kullanılır.

Bağımsız değişken bir bayrak alanıdır; varsayılan davranış için 0, tanımlayıcının exec() çağrıları arasında otomatik olarak kapatılması için EPOLL_CLOEXEC iletin. Döndürülen fd, diğer tüm epoll çağrılarına ileteceğiniz tanımlayıcıdır.

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

epoll_create1 ile epoll_create Karşılaştırması

Daha eski olan epoll_create(int size), bir boyut ipucu alıyordu; ancak çekirdek artık bunu yok sayıyor. Tek gereksinim, değerin pozitif olmasıydı.

epoll_create1() kullanmayı tercih edin: anlamsız bir boyut yerine bayraklar alır ve ayrı bir fcntl() çağrısına gerek kalmadan EPOLL_CLOEXEC istemenizi atomik olarak sağlar.

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

epoll_event Yapısı

İlgi alanları ve sonuçların her ikisi de struct epoll_event aracılığıyla ifade edilir. Bu yapı, bir events bit maskesine ve bir data birleşimine sahiptir.

data birleşimi, olay tetiklendiğinde döndürülmesini istediğiniz her şeyi tutar: genellikle data.fd kullanılır, ancak ayırdığınız bir bağlantı nesnesine işaret eden data.ptr da kullanılabilir.

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

EPOLL_CTL_ADD ile Kaydetme

epoll_ctl(), ilgi listesini yönetir. Bir tanımlayıcıyı izlemeye başlamak için EPOLL_CTL_ADD işlemini kullanın.

epoll tanımlayıcısını, işlemi, hedef tanımlayıcıyı ve epoll_event yapınıza işaret eden bir göstericiyi iletirsiniz. Bundan sonra epoll, bu tanımlayıcının hazır olduğunu bildirecektir.

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

Olay Bayrakları: EPOLLIN ve EPOLLOUT

events maskesi, neyle ilgilendiğinizi belirtir. EPOLLIN, tanımlayıcının okunabilir olduğu; EPOLLOUT ise yazılabilir olduğu anlamına gelir.

Genellikle dinleme soketinde (bağlantıları kabul etmek için) ve istemci soketlerinde (okumak için) EPOLLIN izlenir. EPOLLOUT yalnızca tam olarak gönderilememiş arabelleğe alınmış verileriniz olduğunda eklenmelidir.

ev.events = EPOLLIN | EPOLLOUT;

Hata ve Kapanma Bayrakları

Çekirdek, istememiş olsanız bile belirli koşulları her zaman bildirir: hatalar için EPOLLERR, bir kapanma için EPOLLHUP ve karşı tarafın bağlantıyı tek yönlü kapatması için EPOLLRDHUP.

İşleyicinizde bunları denetleyin; kapanmış bir sokette EPOLLHUP değerini yok saymak, olay döngüsünün boş yere dönüp durmasına neden olur.

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

EPOLL_CTL_MOD ile İlgi Alanını Değiştirme

Bir tanımlayıcı kaydedildikten sonra, onu kaldırmadan olay maskesini değiştirebilirsiniz. Bunun için EPOLL_CTL_MOD kullanılır.

Yaygın bir yaklaşım şudur: bir bağlantı normalde yalnızca EPOLLIN izler; gönderme arabelleği dolduğunda EPOLLIN | EPOLLOUT izlemeye geçer ve arabellek boşaltıldığında yeniden eski duruma döner.

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

EPOLL_CTL_DEL ile Kaldırma

Bir bağlantı kapandığında, EPOLL_CTL_DEL ile onu izlemeyi bırakın. Son epoll_event bağımsız değişkeni yok sayılır ve modern çekirdeklerde NULL olabilir.

Bir tanımlayıcının kapatılması, onu tüm epoll ilgi listelerinden otomatik olarak kaldırır; ancak kapatmadan önce açıkça silmek, kayıtlarınızı anlaşılır tutar.

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

Seviye Tetiklemeli ve Kenar Tetiklemeli

Varsayılan olarak epoll seviye tetiklemelidir: bir tanımlayıcı okunabilir kaldığı sürece her epoll_wait() çağrısı onu bildirir. Bu yaklaşım toleranslı ve kolaydır.

Kenar tetiklemeli kip için EPOLLET bayrağını ekleyin: yalnızca hazır olma durumu değiştiğinde bildirim alırsınız; bu nedenle soketi EAGAIN alıncaya kadar bir döngü içinde tamamen boşaltmanız gerekir.

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

Bağlam Göstericisi Saklama

data.fd yerine, bağlantıya özel bir yapıyı gösteren data.ptr saklayabilirsiniz. Olay tetiklendiğinde bu göstericiyi doğrudan geri alırsınız; bir arama tablosuna gerek kalmaz.

Yalnızca birleşimi unutmayın: data.ptr ayarlarsanız aynı olaydan data.fd değerini de okuyamazsınız.

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

Temizleme

epoll örneği yalnızca bir dosya tanımlayıcısı olduğundan, sunucu kapandığında close() ile serbest bırakılır.

epoll tanımlayıcısının kapatılması, çekirdeğin ilgi listesini serbest bırakır. Hâlâ açık olan izlenen soketler açık kalır; kaynaklarını serbest bırakmak için onları ayrıca kapatın.

close(epfd);

Kısa Denetim

epoll kurulum API'sini ne kadar kavradığınızı sınayın.

Özet

epoll_create1() ile bir örnek oluşturur, ardından ADD, MOD ve DEL kullanarak epoll_ctl() üzerinden ilgi alanlarını yönetirsiniz. Her struct epoll_event, bir events maskesi ve bir data birleşimi taşır.

Basitlik için seviye tetiklemeyi, kenar tetiklemeli performans için ise EPOLLET seçin. Sırada bu parçaları bir olay döngüsünden çalıştıracağız.

Sıkça Sorulan Sorular

“epoll Kurulumu” dersi ücretsiz mi?

Evet — “epoll Kurulumu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“epoll Kurulumu” dersinde ne öğreneceğim?

Bir epoll kümesi oluşturup kaydedin. C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“epoll Kurulumu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Bloklayan ve Bloklamayan G/Ç
  2. epoll Kurulumu
  3. Olay Döngüsü
  4. Basit Bir Yankı Sunucusu
← C Academy Sayfasına Dön