Устанавливает ли dlopen() значение errno?

#c #linux #dlopen

#c #linux #dlopen

Вопрос:

На самом деле все указано в названии. Справочная страница ничего не говорит. Некоторые Google сообщают, что некоторые люди проверяют errno после dlopen, но только немногие и с различными результатами. Функция возвращает значение успеха / неуспеха, но как следует выяснить причину сбоя.

Так же dlopen() устанавливается значение errno? тогда где определены разные значения errno? Если нет, то что следует использовать для проверки причины сбоя?

Комментарии:

1. man dlopen явно говорит нам об dlerror

2.Настройка errno отличается от выполнения errno . Вполне возможно, что вызов dlopen() для изменения значения errno . Например, open() вызов может завершиться неудачей при dlopen() попытке найти библиотеку.

3. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что OP не удосужился прочитать справочную страницу для dlopen

Ответ №1:

Нет (курсив мой добавлен).

После успешного завершения dlopen() вернет дескриптор таблицы символов. Если файл не может быть найден, не может быть открыт для чтения, формат исполняемого объектного файла не подходит для обработки dlopen(), или если в процессе загрузки файла или перемещения его символических ссылок возникает ошибка, dlopen() вернет указатель null. Более подробная диагностическая информация должна быть доступна через dlerror().


Как отмечалось другими, ничто не запрещает dlopen() (или, что более вероятно, функциям, которые dlopen() вызываются) изменять errno . Но система, соответствующая стандарту, dlopen() не будет сообщать о своих собственных ошибках через errno . Вам нужно вызвать dlerror() .

Комментарии:

1. Хорошо, пропустил часть man о dlerror, о которой я не знал. И спасибо Эндрю за ваш комментарий, который, несомненно, объясняет, почему я чувствовал, что был на верном пути, когда изменилось значение errno…

2. Лично мне нравится следовать POSIX, что для меня означает проверку веб-сайта Open Group вместо простого использования локальных справочных страниц. Это правда, что, хотя большинство справочных страниц следуют шаблону, они не стандартизированы, поэтому информация об ошибке может находиться в отдельном разделе или в разделе «возвращаемое значение».

3.В этом ответе отсутствует тот факт, что, хотя dlopen не устанавливает (присваивает значимое значение) значение errno , ему разрешено заменять errno любое значение, отличное от нуля (как и всем другим функциям, которые явно не запрещены делать это, разрешено делать).