#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
любое значение, отличное от нуля (как и всем другим функциям, которые явно не запрещены делать это, разрешено делать).