Чтение сигнализируется select (), но recv () не возвращает данных и сигнализирует EAGAIN о неблокирующих сокетах

У меня есть сигнальный сокет для чтения из select (), но данные не поступают с помощью recv call (), вместо этого он возвращает -1 с errno == EAGAIN.

Я могу допустить, что никакой другой поток не касается сокета.

Я считаю, что это неправильное поведение. Если происходит последующее закрытие с другой стороны, я могу ожидать возврата значения 0 (изящное закрытие) или другого кода ошибки от recv, но не EAGAIN, потому что, по моему мнению, это означает, что данные будут поступать в будущем.

Я нашел предыдущую ветку о проблеме здесь , но без решения.

Такое поведение случается со мной в Ubuntu Linux Oneric или других последних дистрибутивах Linux, затем информация из ссылки размещена здесь

То, что это будет исправлено в ядре, неверно для ядра 3.0.0 или последней версии 2.6. x

Кто-нибудь знает, почему это происходит и как избежать такого нежелательного поведения?

6
задан Community 23 May 2017 в 11:58
поделиться