Я экспериментирую с коротким сервером и клиентом реализация на Python.
На стороне клиента, когда клиент вызывает
Код: Выделить всё
socket.close()
Эти события соответствуют EPOLLIN и EPOLLHUP.< /p>
Почему возникают оба события, а не одно событие EPOLLHUP?
Этот вопрос может показаться тривиальным или неважным, но это не так. потому что, если одновременно может быть вызвано более одного события, логика обработки таких событий становится сложной.
В битовой маске содержится примерно 10 различных типов событий. Предположительно, некоторые из них независимы. Однако в данном случае похоже, что EPOLLHUP подразумевает EPOLLIN.
Один из возможных способов написать логику для обработки событий epoll — это есть ряд операторов if, которые проверяют, установлен ли определенный бит.
Вот как это будет выглядеть:
Код: Выделить всё
if event & select.EPOLLIN:
if event & select.EPOLLHUP:
if event & select.EPOLLOUT:
...
Если мы обработаем эту логику в первом if , то наш код сломается, поскольку второй оператор if также будет оценен как истинный.
Другой вариант может заключаться в более жесткой логике. Вот пример:
Код: Выделить всё
if event == (select.EPOLLIN & select.EPOLLHUP):
if event == (select.EPOLLIN):
...
Надеюсь, вопрос имеет смысл. Для обзора: почему сразу пара событий, особенно в этом случае, когда они оба имеют одинаковое значение. (Клиент отключился.)
Подробнее здесь: https://stackoverflow.com/questions/792 ... oll-events