Я прочитал это предложение из Сетевого программирования 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()
, но я могу ошибаться.
Спасибо