Как "специальные" флаги epoll соответствуют kqueue?

Я пытаюсь провести параллель между флагами epoll и kqueue, особенно EPOLLONESHOT EPOLLET EPOLLEXCLUSIVE и 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, который опрашивал это событие? То есть, если мы опрашиваем сокет для EVFILT_READ в двух kqueues, его получит только один, а затем, пока одно и то же событие не будет установлено с помощью 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

0 ответов

  1. EV_CLEAR не равно EPOLLETНапример, некоторые прослушивающие сокеты имеют 5 ожидающих соединений, и вы не используете их все (accept до тех пор EAGAIN), то с EV_CLEAR, вы не получите EVFILT_READ событие от kevent пока не появится 6-е соединение.

  2. EPOLLEXCLUSIVE используется для привязки процессора, это не связано с EV_DISPATCH,

  3. EV_ONESHOT значит удалить knote после того, как определенное событие вызвано, в то время как EV_DISPATCH только отключи это.

  4. Если один сокет fd зарегистрирован в нескольких kqueues, то событие транслируется во время его запуска.

  5. EV_ONESHOT почти равно EPOLLONESHOT, это полезно в том случае, если разные потоки должны вызывать kevent с тем же Kqueue FD.

Другие вопросы по тегам