Поведение so_error для сокета и epoll - PullRequest
0 голосов
/ 09 мая 2019

Я прочитал это предложение из Сетевого программирования Unix book

Если so_error отличен от нуля, когда процесс вызывает read и нет данные для возврата, чтение возвращает – 1 с errno, установленным в значение so_error (стр. 516 TCPv2). Значение so_error затем сбрасывается на 0. Если есть данные поставлены в очередь для сокета, эти данные возвращаются чтением вместо из условия ошибки. Если so_error не равен нулю при вызове процесса write, -1 возвращается с errno, установленным в значение so_error (стр. 495 TCPv2) и so_error сбрасывается в 0.

Похоже, что, если я правильно понимаю, опция SO_ERROR не сбрасывается в 0, если есть данные для чтения из сокета: Если есть данные, поставленные в очередь для сокета, эти данные возвращаются читать вместо условия ошибки

Мне интересно, что будет при использовании epoll для мониторинга этого сокета.

Первое событие будет содержать флаги EPOLLIN и EPOLLERR, которые имеют смысл. Вызов read() в этом сокете вернет данные вместо ошибки, при условии, что в очереди есть данные, как указано в предложении.

Теперь представьте, что я перезапускаю сокет для экземпляра epoll, будет ли он сообщать EPOLLERR для этого сокета при следующем вызове epoll_wait, учитывая тот факт, что в очереди больше нет данных? Это то, что я предполагаю, так как ничто в цитируемом предложении не указывает, что SO_ERROR был сброшен после предыдущего вызова read(), но я могу ошибаться.

Спасибо

...