# kqueue
## 定義
**kqueue** は FreeBSD・NetBSD・macOS が提供するスケーラブルな汎用イベント通知機構である。`kqueue()` でリスニングオブジェクトを作成し、`kevent()` で監視対象の追加・変更・取得を行う。[[epoll]] の BSD/macOS 版に相当するが、ソケット以外にも**ファイル・シグナル・I/O 完了・タイマー・プロセスイベント**を統一的に監視できる点でより汎用的。
## 歴史
- **FreeBSD 4.1(2000)** — Jonathan Lemon が初期実装を FreeBSD に導入。BSDCon 2000 で発表。
- **NetBSD** — NetBSD-current(2002年10月頃)で採用。
- **macOS** — Darwin カーネルが kqueue をサポート。macOS の Grand Central Dispatch(GCD)の基盤でもある。
## API
```c
// kqueue インスタンス作成
int kq = kqueue();
// 変更セット: 監視追加(EVFILT_READの読み込み監視)
struct kevent change;
EV_SET(&change, sockfd, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, NULL);
// ↑ EV_CLEAR でエッジトリガ相当
// 変更適用 + イベント取得(タイムアウトは NULL で無限)
struct kevent events[MAX_EVENTS];
int n = kevent(kq, &change, 1, events, MAX_EVENTS, NULL);
```
## フィルタ種別
| フィルタ | 対象 |
|---------|------|
| `EVFILT_READ` | ソケット・パイプの読み込み可能 |
| `EVFILT_WRITE` | ソケット・パイプの書き込み可能 |
| `EVFILT_VNODE` | ファイルシステムイベント(変更・削除等) |
| `EVFILT_PROC` | プロセスイベント(終了・fork 等) |
| `EVFILT_SIGNAL` | シグナル受信 |
| `EVFILT_TIMER` | タイマー発火 |
| `EVFILT_AIO` | AIO 完了 |
## epoll との比較
| 項目 | [[epoll]] | kqueue |
|-----|---------|--------|
| 対象 OS | Linux | BSD / macOS |
| 監視対象 | ソケット中心 | ソケット・ファイル・シグナル等 |
| トリガモード | レベル / エッジ(`EPOLLET`) | レベル / エッジ(`EV_CLEAR`) |
| API | create + ctl + wait(3関数) | kqueue + kevent(2関数) |
## 現代の利用
libevent・libuv(Node.js)・Tokio(Rust)・Python asyncio が macOS/BSD 上で kqueue をバックエンドに使用。[[nginx]] も kqueue をサポート。
## 関連
- [[C10K問題]] — kqueue が解決した問題
- [[epoll]] — Linux 向けの相当機構
- [[C10K-Problem]] — 原典