C dlopen()是否设置了errno?
一切都在标题里。手册页什么也没说。一些谷歌报告说,有人在dlopen之后检查errno,但很少有人检查,结果也不尽相同。函数确实返回成功/不成功值,但如何找出失败的原因呢C dlopen()是否设置了errno?,c,linux,dlopen,C,Linux,Dlopen,一切都在标题里。手册页什么也没说。一些谷歌报告说,有人在dlopen之后检查errno,但很少有人检查,结果也不尽相同。函数确实返回成功/不成功值,但如何找出失败的原因呢 dlopen()是否设置了errno?那么,在哪里定义了不同的errno值呢? 如果不是,应该用什么来检查故障的原因?(重点添加) 成功完成后,dlopen()将返回一个符号表句柄。如果无法找到文件、无法打开读取文件、文件格式不适合dlopen()处理,或者在加载文件或重新定位其符号引用的过程中发生错误,dlopen()应返回
dlopen()
是否设置了errno?那么,在哪里定义了不同的errno值呢?
如果不是,应该用什么来检查故障的原因?(重点添加)
成功完成后,dlopen()将返回一个符号表句柄。如果无法找到文件、无法打开读取文件、文件格式不适合dlopen()处理,或者在加载文件或重新定位其符号引用的过程中发生错误,dlopen()应返回空指针更详细的诊断信息可通过获得
正如其他人所指出的,没有任何东西禁止
dlopen()
(或者更可能是dlopen()
调用的函数)修改errno
。但是符合标准的dlopen()
不会通过errno
报告其自身的错误。您需要调用dlerror()
(添加了强调)
成功完成后,dlopen()将返回一个符号表句柄。如果无法找到文件、无法打开读取文件、文件格式不适合dlopen()处理,或者在加载文件或重新定位其符号引用的过程中发生错误,dlopen()应返回空指针更详细的诊断信息可通过获得
正如其他人所指出的,没有任何东西禁止
dlopen()
(或者更可能是dlopen()
调用的函数)修改errno
。但是符合标准的dlopen()
不会通过errno
报告其自身的错误。您需要调用dlerror()
man dlopen
清楚地告诉我们关于dlerror
…设置errno
不同于影响errno
。调用dlopen()
可以更改errno
的值。例如,open()
调用可能由于dlopen()而失败
尝试查找库。我投票将此问题作为主题外的问题结束,因为OP懒得阅读dlopen
man dlopen
的手册页,它清楚地告诉我们关于dlerror
…设置errno
不同于影响errno
。调用dlopen()
可以更改errno
的值。例如,open()
调用可能会失败,因为dlopen()
尝试查找库。我投票关闭这个问题,因为OP懒得阅读dlopen
的手册页。好的,错过了我不知道的关于dlerror的手册部分。感谢Andrew的评论,这当然可以解释为什么我觉得在errno改变的时候我走上了正轨……就我个人而言,我喜欢遵循POSIX,这对我来说意味着检查Open Group的网站,而不是简单地使用本地手册页。诚然,尽管大多数手册页遵循一种模式,但它们并没有标准化,因此错误信息可能在其自己的部分,或者可能在“返回值”部分。这个答案忽略了一个事实,即虽然dlopen
没有设置(分配有意义的值)到errno
,但是,允许使用除零以外的任何值对errno
进行重击(就像所有其他未明确禁止这样做的函数一样),好的,错过了关于dlerror的主要部分,我不知道。感谢Andrew的评论,这当然可以解释为什么我觉得在errno改变的时候我走上了正轨……就我个人而言,我喜欢遵循POSIX,这对我来说意味着检查Open Group的网站,而不是简单地使用本地手册页。诚然,尽管大多数手册页遵循一种模式,但它们并没有标准化,因此错误信息可能在其自己的部分,或者可能在“返回值”部分。这个答案忽略了一个事实,即虽然dlopen
没有设置(分配有意义的值)到errno
,但是,允许使用除零以外的任何值对errno
进行重击(就像所有其他未明确禁止的函数一样)。