Как "специальные" флаги 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.
Вопросы
Итак, вопросы:
- Правильно ли мое понимание? Правильно ли я понял эти специальные флаги по сравнению с epoll? Документация кажется мне немного хитрой; возможно проблема в том, что я раньше использовал только epoll и еще не играл с kqueue.
- Не могли бы вы предоставить хорошие источники или примеры, чтобы увидеть методы kqueue? Было бы хорошо, если бы это было не так сложно, как Boost.Asio; было бы также неплохо, чтобы эти источники были написаны на C.
- Можно ли эти флаги объединить? Например, EPOLLONESHOT нельзя комбинировать с EPOLLEXCLUSIVE, но EV_DISPATCH, кажется, находится точно посередине между этими флагами.
Спасибо за помощь!
Рекомендации
kqueue(2): Руководство по системным вызовам FreeBSD
0 ответов
EV_CLEAR
не равноEPOLLET
Например, некоторые прослушивающие сокеты имеют 5 ожидающих соединений, и вы не используете их все (accept
до тех порEAGAIN
), то сEV_CLEAR
, вы не получитеEVFILT_READ
событие отkevent
пока не появится 6-е соединение.EPOLLEXCLUSIVE
используется для привязки процессора, это не связано сEV_DISPATCH
,EV_ONESHOT
значит удалитьknote
после того, как определенное событие вызвано, в то время какEV_DISPATCH
только отключи это.Если один сокет fd зарегистрирован в нескольких kqueues, то событие транслируется во время его запуска.
EV_ONESHOT
почти равноEPOLLONESHOT
, это полезно в том случае, если разные потоки должны вызыватьkevent
с тем же Kqueue FD.