イベントがkqueue
に登録されている場合、そのイベントに関連するIDは タイプが提供されます。例えば、ファイルディスクリプタは私もとの競合を避けるために他のイベントタイプ我々はたkqueueの新しい インスタンスを必要とするような信号に応答する必要がある場合は、今すぐkqueueを使用して複数のイベントタイプに応答する
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
の引数は 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をエッジトリガーする手段として と考えることもできます。
IDは一意ではないため、同じイベントqでさまざまなイベントタイプを混在させることができますか?それともあなたの質問が間違っていますか? – dhein
まさに正しい。 kevent構造体がイベントタイプを格納しないため、IDは一意でなければなりません。 1つのイベントタイプに応答するのは、kevent()でブロックする非常に簡単なループですが、スレッド(またはプロセス)間の調整が必要と思われるので、複数のイベントタイプ(私の例ではVNODE&SIGNAL)を処理することはかなり困難です。 – eradman
ええ、私は残念です...しかし、私は未来にもこのことが必要です....私は、IDがシステム内で一意であるため、複数のスレッドやプロセスで何の問題もないと思ったばかりです範囲。しかし、私はこれに従うつもりです。 – dhein