3

ユーザー空間イベントにkqueueを使用する方法を理解するのに苦労しています。
2つのユースケースを探しています。
ユース ケース 1: 手動リセット イベント
ユース ケース 2: 自動リセット イベント

kqueue() と kevent() の使用方法は理解していると思いますが、kevent() に渡されたイベントが関連する操作をどのように検索するかについては不明です
。「event」という名前の構造体 kevent 変数があるとします。
「eventId」という名前の、その kqueue インスタンスの他のイベント ID と衝突しない新しいイベント ID を問題なく見つけることができると仮定しましょう。

  1. ユーザーイベントの作成: EV_SET(&event, eventId, EVFILT_USER, EV_ADD, NOTE_FFNOP, 0, NULL)
  2. ユーザーイベントの破棄: EV_SET(&event, eventId, EVFILT_USER, EV_DESTROY, NOTE_FFNOP, 0, NULL)
  3. ユーザーイベントを設定します: EV_SET(&event, eventId, EVFILT_USER, ?????, NOTE_FFNOP, 0, NULL)
  4. ユーザーイベントのリセット: EV_SET(&event, eventId, EVFILT_USER, ??EV_CLEAR???, NOTE_FFNOP, 0, NULL )
  5. パルスユーザーイベント: EV_SET(&event, eventId, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL )
  6. 待機ループでは、切り取られたものが続くと思います: if( event.filter == EVFILT_USER && event.ident == eventId ) { // これは私のイベントです! 何とかしろ!}

????を参照してください 上記の EV_SET() 呼び出しで、助けが必要な場所を確認します。
ユース ケース 1 (手動リセット イベント) の操作 (1) 作成は、ユース ケース 2 (自動リセット イベント) とは異なる場合があります。
操作 (3) と (4) 私は完全に暗闇の中にいます。それらには EV_ENABLE/EV_DISABLE が必要ですか? EV_CLEAR はどこに適合しますか?
これまでのところ、操作 (6) では「ディスパッチ」以外は何もする必要はないと想定しています。上記のように操作 (5) が機能する可能性があることはかなり肯定的です。

私は今、それがどのように行われているかを示すドキュメントやサンプルを探すのに 1 日を費やしました。Appleコードベースでkqueueテストプログラムを見つけましたが、それが正しく機能しているとは思えません。また、テストで 1 つのイベントのみを送信し、そのイベントは受信スレッドのループを終了します。そのため、2 つのユース ケースの詳細を理解するのに役立ちません。

x86 マシンの FreeBsd 9.1 で使用する予定です...今のところ。

4

1 に答える 1