epoll
I/Oの多重化をするためのシステムコール群
fs/eventpoll.cに由来する “event poll” → epoll
複数のファイルディスクリプタを監視し、その中のいずれかが入出力可能な状態であるかを確認する
ソケット通信に関係がある
selectシステムコールと比べて、管理できるディスクリプタの数は無制限
rlimitの設定値以上は作れない
ファイルディスクリプタを見に行くときの計算量が$ O(1) なのでパフォーマンスが良い
ファイルディスクリプタの監視をカーネル空間で行っているため
ポーリングを使う?
poll/epollの違いは...?
レベルトリガーとエッジトリガーとは...?
epoll におけるレベルトリガーとエッジトリガー - Mackey's Lab
epollのサンプル実装はGeekなページのやつが参考になる
8-5 epollを使ったデータ受信プログラム:Geekなぺーじ
内部で赤黒木を使っている
linux/fs/eventpoll.c at master · torvalds/linux
sys/epoll.hを使う
使用できる関数
table:sys/epoll.h
関数 Kernel
epoll_create(2) 2.6
epoll_create1(2) 2.6.27
epoll_ctl(2) 2.6
epoll_pwait(2) 2.6.19
epoll_pwait2(2) 5.11
epoll_wait(2) 2.6
code:memo.c
#include <sys/epoll.h>
int epoll_create(int size);
int epoll_create1(int flags);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,
int maxevents, int timeout,
const sigset_t *_Nullable sigmask);
int epoll_pwait2(int epfd, struct epoll_event *events,
int maxevents, const struct timespec *_Nullable timeout,
const sigset_t *_Nullable sigmask);
関連するカーネルパラメータ
/proc/sys/fs/epoll/max_user_watches
code:memo.c
// 非ブロッキング + EAGAIN まで読み切りの実装
static void do_use_fd(int fd) {
for (;;) {
char buf8192;
ssize_t n = read(fd, buf, sizeof buf);
if (n > 0) {
// 受け取ったデータを処理(キューに積む等)
continue; // まだ読めるかもしれないのでループ継続
}
if (n == 0) {
// EOF(対向がclose)
close(fd);
break;
}
if (n < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// ここまでで読み尽くした → 次のエッジを待つ
break;
}
if (errno == EINTR) {
continue; // 割り込み → 再試行
}
// その他のエラー
perror("read");
close(fd);
break;
}
}
}
関連API
poll
select
(BSD/macOS) kqueue
(Windows) IOCP
関連
イベント駆動
エコーサーバー
スタベーション
libuv
libevent
ストリーム
Rustでepoll
確認用
Q. epoll
参考
Man page of EPOLL
epoll - 約束事その他の説明 - Linux コマンド集 一覧表
8-5 epollを使ったデータ受信プログラム:Geekなぺーじ
I/Oを多重化するためのシステムコール(select, poll, epoll, kqueue) - $shibayu36->blog;
epoll_pwait2(2) — Arch manual pages
ChatGPT.iconhttps://chatgpt.com/share/689cda02-ce70-800d-8550-2db580d4f78e
メモ
サーバー入門、非同期処理入門、epoll 入門 | blog.ojisan.io
read, writeはストリームに書くシステムコール
TCPでストリームを作り接続するためのシステムコールがscoket(2), connect(2), bind(2), listen(2), accept(2)
C10K問題
epollで作るチャットサーバ | κeenのHappy Hacκing Blog
epoll - Wikipedia
epollのなかみ - moriyoshiの日記
#システムコール #Linux #ソケット通信 #ネットワークプログラミング