3

EPOLLONESHOT EPOLLET EPOLLEXCLUSIVEepoll フラグと kqueue フラグ、特にEV_CLEAR/EV_DISPATCH/EV_ONESHOTの間の類似点を描くのに苦労しています。初めてkqueueを調査しています。私はepollでしか経験がありませんでした。

EV_DISPATCH

EPOLLEXCLUSIVE フラグと EPOLLONESHOT フラグを組み合わせたような感じです。kqueue のドキュメントから:

EV_DISPATCH  Disable the event source immediately after delivery of an
             event.  See EV_DISABLE above.
EV_DISABLE   Disable the event so kevent()  will not return it.  The fil-
             ter itself is  not disabled.

このイベントをポーリングした kqueue インスタンスが少なくとも 1 つある場合、イベントが通知され、すぐに破棄されるというドキュメントを正しく理解していますか? つまり、2 つの kqueue で EVFILT_READ のソケットをポーリングすると、それを受け取るのは 1 つだけです。その後、同じイベントが EVFILT_ENABLE で設定されるまで、新しいデータがソケットに届いたとしても、それ以上のイベントはまったく発生しません。 ?

EV_CLEAR

EPOLLETに近いようです。kqueue のドキュメントから:

EV_CLEAR      After the event is retrieved by the user, its state is
              reset.  This is useful for filters which report state tran-
              sitions instead of the current state.  Note that some fil-
              ters may automatically set this flag internally.

したがって、たとえば、EVFILT_READ を持つ同じソケットが与えられた場合、それを同時にポーリングするすべての kqueues は、EVFILT_READ で起動します。ただし、すべてのデータが読み取られない場合 (つまり、EAGAIN まで)、それ以上のイベントは報告されません。すべてのデータが読み取られ、新しいデータが到着した場合にのみ、新しい EVFILT_READ イベントがトリガーされます。それが正しいか?

EV_ONESHOT

EPOLLONESHOT にマップされているようです。kqueue のドキュメントから:

EV_ONESHOT   Causes the event to return only the first occurrence of the
             filter being triggered.  After the user retrieves the  event
             from the kqueue, it is deleted.

質問

だから、質問:

  1. 私の理解は正しいですか?epoll と比較して、これらの特別なフラグを正しく理解できましたか? ドキュメンテーションは私には少し難しいようです。おそらく問題は、私が以前に epoll しか使用したことがなく、まだ kqueue を使用したことがないことです。
  2. kqueue テクニックを確認するための良い情報源または例を提供していただけますか? Boost.Asio のように複雑にならないようにすればいいのにと思います。また、これらのソースが C で書かれているとよいでしょう。
  3. これらのフラグを組み合わせることはできますか? たとえば、EPOLLONESHOT は EPOLLEXCLUSIVE と組み合わせることはできませんが、EV_DISPATCH はこれらのフラグのちょうど中間にあるようです。

ご協力ありがとうございました!

参考文献

kqueue(2): FreeBSD システムコールマニュアル

epoll(7): Linux プログラマーズ マニュアル

epoll_ctl(7): Linux プログラマーズ マニュアル

4

1 に答える 1