イベントが登録されたとき、kqueue
そのイベント タイプに関連する ID が提供されます。たとえば、ファイル記述子は、監視するファイルを識別するために使用されます
int kq;
struct kevent ke;
kq = kqueue();
fd = open(argv[1], O_RDONLY);
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD, NOTE_DELETE | NOTE_RENAME, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);
while (1) {
kevent(kq, NULL, 0, &ke, 1, NULL);
/* respond to file system event */
}
ここで、シグナルなどの他のイベント タイプにも応答する必要がある場合は、 のident
引数との競合を避けるために、kqueue の新しいインスタンスが必要です
kevent()
。
kq_sig = kqueue();
struct kevent ke_sig;
/* set the handler and ignore SIGINT */
signal(SIGINT, SIG_IGN);
EV_SET(&ke_sig, SIGINT, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
kevent(kq_sig, &ke_sig, 1, NULL, 0, NULL);
while (1) {
kevent(kq_sig, NULL, 0, &ke_sig, 1, NULL);
/* respond signals */
}
複数のイベント タイプを監視するには、共有状態で動作する複数のスレッドが必要になるようです (たとえば、シグナルを受信すると、ファイル記述子が閉じられる可能性があります)。
kqueue を使用してあるスレッドから別のスレッドにメッセージを送信するためのより一般的なメカニズムはありますか? 場合によっては、別の kevent をエッジ トリガーする手段としてフィルターを有効または無効にすることを考えることができます。