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