Menyiapkan epoll
Buat dan daftarkan kumpulan epoll.
Menyiapkan epoll adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.
Membuat Instans epoll
Semuanya dimulai dari instans epoll, yang juga merupakan deskriptor berkas. Buat instans tersebut dengan epoll_create1().
Argumennya adalah kolom bendera; berikan 0 untuk perilaku bawaan atau EPOLL_CLOEXEC agar deskriptor ditutup secara otomatis saat melintasi exec(). fd yang dikembalikan adalah fd yang Anda teruskan ke setiap pemanggilan epoll lainnya.
int epfd = epoll_create1(EPOLL_CLOEXEC);
if (epfd == -1) { perror("epoll_create1"); exit(1); }epoll_create1 vs epoll_create
epoll_create(int size) yang lebih lama menerima petunjuk ukuran, tetapi kernel kini mengabaikannya; satu-satunya persyaratan adalah nilainya positif.
Utamakan epoll_create1(): fungsi ini menerima bendera, bukan ukuran yang tidak bermakna, dan memungkinkan Anda meminta EPOLL_CLOEXEC secara atomik sehingga tidak memerlukan pemanggilan fcntl() terpisah.
/* legacy form, size arg ignored by kernel */
int epfd = epoll_create(1);Struktur epoll_event
Minat dan hasil sama-sama dinyatakan melalui struct epoll_event. Struktur ini memiliki bitmask events dan union data.
Union data menyimpan apa pun yang ingin Anda terima saat peristiwa terpicu: biasanya data.fd, tetapi dapat juga berupa data.ptr yang menunjuk ke objek koneksi yang Anda alokasikan.
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listen_fd;Mendaftarkan dengan EPOLL_CTL_ADD
epoll_ctl() mengelola daftar minat. Gunakan operasi EPOLL_CTL_ADD untuk mulai memantau suatu deskriptor.
Anda meneruskan fd epoll, operasi, fd target, dan penunjuk ke epoll_event. Setelah itu, epoll akan melaporkan kesiapan deskriptor tersebut.
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");Bendera Peristiwa: EPOLLIN dan EPOLLOUT
Masker events menyatakan hal yang ingin Anda pantau. EPOLLIN berarti deskriptor dapat dibaca; EPOLLOUT berarti deskriptor dapat ditulisi.
Biasanya Anda memantau EPOLLIN pada soket yang mendengarkan (untuk menerima koneksi) dan pada soket klien (untuk membaca). Tambahkan EPOLLOUT hanya jika ada data tersangga yang belum terkirim sepenuhnya.
ev.events = EPOLLIN | EPOLLOUT;Bendera Kesalahan dan Hangup
Kernel selalu melaporkan kondisi tertentu meskipun Anda tidak memintanya: EPOLLERR untuk kesalahan, EPOLLHUP untuk hangup, dan EPOLLRDHUP untuk penutupan sebagian oleh peer.
Periksa kondisi ini di penangan Anda; mengabaikan EPOLLHUP pada soket yang sudah mati menyebabkan perulangan terus berputar di dalam perulangan peristiwa.
if (ev.events & (EPOLLERR | EPOLLHUP)) {
close(ev.data.fd);
continue;
}Mengubah Minat dengan EPOLL_CTL_MOD
Setelah deskriptor didaftarkan, Anda dapat mengubah maskernya tanpa menghapusnya. Gunakan EPOLL_CTL_MOD.
Pola yang umum: koneksi biasanya hanya memantau EPOLLIN, lalu beralih ke EPOLLIN | EPOLLOUT saat penyangga pengirimannya penuh, dan kembali lagi setelah dikosongkan.
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_fd;
epoll_ctl(epfd, EPOLL_CTL_MOD, conn_fd, &ev);Menghapus dengan EPOLL_CTL_DEL
Saat koneksi ditutup, hentikan pemantauannya dengan EPOLL_CTL_DEL. Argumen epoll_event terakhir diabaikan dan dapat berupa NULL pada kernel modern.
Perhatikan bahwa menutup deskriptor secara otomatis menghapusnya dari semua daftar minat epoll, tetapi penghapusan secara eksplisit sebelum penutupan membuat pencatatan Anda tetap jelas.
epoll_ctl(epfd, EPOLL_CTL_DEL, conn_fd, NULL);
close(conn_fd);Pemicu Tingkat vs Pemicu Tepi
Secara bawaan, epoll menggunakan pemicu tingkat: selama deskriptor tetap dapat dibaca, setiap epoll_wait() akan melaporkannya. Cara ini toleran terhadap kesalahan dan mudah digunakan.
Tambahkan bendera EPOLLET untuk mode pemicu tepi: Anda hanya diberi tahu saat kesiapan berubah, sehingga Anda harus mengosongkan soket sepenuhnya dalam sebuah perulangan hingga EAGAIN.
ev.events = EPOLLIN | EPOLLET; /* edge-triggered */
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);Menyimpan Penunjuk Konteks
Alih-alih data.fd, Anda dapat menyimpan data.ptr yang menunjuk ke struktur untuk setiap koneksi. Saat peristiwa terpicu, Anda langsung mendapatkan kembali penunjuk tersebut tanpa memerlukan tabel pencarian.
Ingat union tersebut: jika Anda menetapkan data.ptr, Anda juga tidak dapat membaca data.fd dari peristiwa yang sama.
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);Membersihkan Sumber Daya
Instans epoll hanyalah deskriptor berkas, jadi lepaskan dengan close() saat server dimatikan.
Menutup fd epoll membebaskan daftar minat kernel. Soket yang dipantau dan masih terbuka tetap terbuka; tutup soket tersebut secara terpisah untuk melepaskan sumber dayanya.
close(epfd);Pemeriksaan Singkat
Uji pemahaman Anda tentang API penyiapan epoll.
Rangkuman
Anda membuat instans dengan epoll_create1(), lalu mengelola minat melalui epoll_ctl() menggunakan ADD, MOD, dan DEL. Setiap struct epoll_event membawa masker events dan union data.
Pilih pemicu tingkat untuk kesederhanaan atau EPOLLET untuk kinerja pemicu tepi. Selanjutnya, kita menggerakkan bagian-bagian ini dari sebuah perulangan peristiwa.
Belajar C dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 39
- Pelajaran
- 144
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menyiapkan epoll” gratis?
Ya — teks lengkap “Menyiapkan epoll” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menyiapkan epoll”?
Buat dan daftarkan kumpulan epoll. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C Academy?
Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Menyiapkan epoll” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?
Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.