Каков правильный размер списка событий для kevent?
Хороший день для тебя,
Некоторое время назад я использовал API для небольшой работы с сетевым программированием. Я потерял весь свой код из-за отказа жесткого диска.
Теперь, столкнувшись с той же проблемой, я возвращаюсь к . Проблема в том, что в последнее время я использовал первичные системные вызовы для
Linux
. Я совсем забыл методологию с 's. Например, меня удивило, что различаются события чтения и записи на
socket
.
Теперь у меня такое чувство, что я не могу четко сказать, какие события группируются вместе. Например, если я получаю события процесса с разными файлами, система группирует или ставит событие в очередь? Я имею в виду, что мой ничего не говорит о том, какие данные возвращаются с
fflags
когда событие было запущено. И много таких вопросов.
Я пытаюсь добраться до сути. Проблема, которая у меня есть на данный момент, заключается в том, что
epoll
возвращает изменения как
bitmask
и необязательное поле данных. И я привыкаю к этому. Таким образом, размер возвращаемого массива событий можно определить заранее. Определенно может вернуть больше событий, чем я зарезервировал для своего списка изменений. Я имею в виду, возьмите
signal
с системными вызовами. В мануале четко указано, что каждый тип сигнала — это отдельное событие, но количество доставок отдельных сигналов возвращается в
data
подал. Это означает, что сигналы сгруппированы, и я могу зарезервировать массив с самого начала. Я чувствую, что с процессными событиями такого не происходит. События могут быть вызваны
fork
и поставили в очередь. Или я ошибаюсь?
Теперь действительно к делу. Какова правильная стратегия резервирования места для возвращаемых событий? И, в качестве вспомогательного вопроса, повторяется ли событие чтения/записи в сокете при следующем вызове, когда было частичное чтение/запись?
Обновлять
Может быть, я неправильно интерпретирую поиск событий? Чтение через
man
, Я понимаю
EV_CLEAR После того, как событие получено пользователем, его состояние сбрасывается.
Так что отставание
kqueue
может быть больше фактического размера аргумента списка событий. И другое событие будет стоять в очереди для следующего вызова?
Больше обновлений
Я неправильно понял весь процесс. я следовал
FreeBSD
код справочника. И код проверяет возвращаемое значение
kevent
быть больше, чем максимальный размер массива. Это не соответствует мануалу. В руководстве сказано, что:
Системный вызов kevent() возвращает количество событий, помещенных в список событий, вплоть до значения, заданного nevents.