Почему закрытие клиентского сокета вызывает два события epoll?Linux

Anonymous
Почему закрытие клиентского сокета вызывает два события epoll?

Сообщение Anonymous »

Похоже, что система epoll вызовет пару событий, если клиентский сокет отключится с помощью вызова функции close.
Я экспериментирую с коротким сервером и клиентом реализация на Python.
На стороне клиента, когда клиент вызывает

Код: Выделить всё

socket.close()
на стороне сервера возникает пара событий.
Эти события соответствуют EPOLLIN и EPOLLHUP.< /p>
Почему возникают оба события, а не одно событие EPOLLHUP?
Этот вопрос может показаться тривиальным или неважным, но это не так. потому что, если одновременно может быть вызвано более одного события, логика обработки таких событий становится сложной.
В битовой маске содержится примерно 10 различных типов событий. Предположительно, некоторые из них независимы. Однако в данном случае похоже, что EPOLLHUP подразумевает EPOLLIN.
Один из возможных способов написать логику для обработки событий epoll — это есть ряд операторов if, которые проверяют, установлен ли определенный бит.
Вот как это будет выглядеть:

Код: Выделить всё

if event & select.EPOLLIN:

if event & select.EPOLLHUP:

if event & select.EPOLLOUT:

...
Однако порядок операторов важен. Если мы сначала проверим EPOLLIN и обнаружим, что для чтения нет байтов данных, это говорит о том, что клиент отключился.
Если мы обработаем эту логику в первом if , то наш код сломается, поскольку второй оператор if также будет оценен как истинный.
Другой вариант может заключаться в более жесткой логике. Вот пример:

Код: Выделить всё

if event == (select.EPOLLIN & select.EPOLLHUP):

if event == (select.EPOLLIN):

...
Вероятно, это будет довольно хрупко, и охватить все возможные комбинации нереально.
Надеюсь, вопрос имеет смысл. Для обзора: почему сразу пара событий, особенно в этом случае, когда они оба имеют одинаковое значение. (Клиент отключился.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... oll-events

Вернуться в «Linux»