2017-02-23 302 views
0

Возможно ли, чтобы функция socket() завершилась с ошибкой EINPROGRESS в Linux? Обратите внимание, что я специально спрашиваю о socket(), а не connect() или других.Can socket() fail с EINPROGRESS

POSIX не указан EINPROGRESS как возможный код ошибки. Однако manpage для socket() в Linux говорит:

Другие ошибки могут генерироваться базовыми модулями протокола.

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

+0

Я не вижу, как. Нет ничего, что могло бы начаться. Нет ввода-вывода: просто создание сокета FD. Почему вы спрашиваете? – EJP

+1

Я думаю, что manpage здесь недвусмыслен: могут быть протоколы, которые на самом деле _do_ возвращают 'EINPROGRESS' при вызове' socket() '. Но ни один из широко используемых протоколов не делает этого. Невозможно вернуть ссылающийся файл-регистратор, поэтому он должен был быть жесткой ошибкой, что несколько противоречит смыслу 'EINPROGRESS' – Ctx

ответ

0

EINPROGRESS означает, что операция выполняется. Он блокируется из-за внешней причины: дождитесь удаленного действия или локального устройства.

socket() создает только запись в памяти системы: нет причин ждать какого-либо удаленного действия или любого устройства.

Но если бы он смог вернуть EINPROGRESS, вам нечего было ждать.

С помощью дескрипторов файлов и ручек сокетов вы можете использовать select(), чтобы ждать готовности системы. Но если сам сокет() ничего не возвращает, вам нечего ждать.

Я не вижу причины для сокета(), чтобы вернуть EIPROGRESS, но это было бы плохой идеей.

0

Может быть, не ответ, который вы искали:

Вы должны проверить соответствующие Linux kernel source code (kernel/net/socket.c) тщательно, чтобы быть 100% уверен. Проглядывая код, он не выглядит так: EINPROGRESS возвращается где угодно. Тем не менее, там есть зависящие от времени вызовы, поэтому его трудно сказать только из статического анализа кода.