从以前的libc.so.6库调用中访问errno值的方法?

从以前的libc.so.6库调用中访问errno值的方法?,c,linux,gnu,C,Linux,Gnu,如果我试图做的不是一个好主意或不支持,请随时让我知道。我正在尝试使用各种系统库(libc.so.6,libpthread.so.0,等等)作为API。API将调用这些库来访问open(),`close()等 我不确定是否在失败时处理errno,返回-1,而不是直接返回errno。当我在libc.so.6中调用close()时,它在失败时返回-1,这样我就可以检测到发生的错误。但是,我似乎在libc中找不到任何机制允许我查询errno的当前值,该值可能是由同一线程中的前一个函数调用设置的。调用pt

如果我试图做的不是一个好主意或不支持,请随时让我知道。我正在尝试使用各种系统库(
libc.so.6
libpthread.so.0
,等等)作为API。API将调用这些库来访问
open()
,`close()等

我不确定是否在失败时处理errno,返回-1,而不是直接返回errno。当我在
libc.so.6
中调用
close()
时,它在失败时返回-1,这样我就可以检测到发生的错误。但是,我似乎在libc中找不到任何机制允许我查询errno的当前值,该值可能是由同一线程中的前一个函数调用设置的。调用pthread函数时,这不是问题,因为它们直接返回errno的值,我可以处理这个问题

在使用某种库调用设置errno(例如
close()
)的函数执行后,是否有方法确定给定线程的errno的当前值

可能的解决办法:

我可以编写一个包装器库来调用
close()
,等等。。。在错误状态下查询errno,并直接返回errno,但我试图避免包含API中必须包含的自定义库


如果有一种方法可以调用标准库,那将是理想的。

errno
不是像linux这样的多线程环境中的全局每个进程变量(过去是这样),每个线程都有一个不同的
errno
伪变量(实际上
errno
是在
\include
中定义的宏)。在回答您的问题时,保存上一次系统调用中的
errno
的最佳且最简单的方法是在系统调用完成后立即复制一份
errno
。您甚至可以在系统调用周围创建一个包装器,将errno值存储在循环缓冲区中,这样您就可以获取最后一个、上一个到最后一个等,直到某个固定值。由于存储所有这些值需要一定量的内存,因此系统中没有为此调用任何配置。此外,
errno
值与一个线程执行的最后一次系统调用相关,因此您必须决定如何以及何时执行系统调用,您还可以决定是否要存储错误值的方式和时间

“变量”
errno
是线程本地的,而不是全局的。不清楚您在问什么<每个线程都可以全局访问代码>错误号。所以你不需要任何库函数来获取它的值。简单地说:
r=some_libc_函数();如果(r==-1)最后一个错误号=errno谢谢你的回复。我可能应该进一步澄清,我是从一个提供了调用库接口的环境中访问这些库的,但没有一种方法可以在这些库调用的同时编译代码,例如直接将errno作为变量包含和访问。这就是为什么我试图看看如果我没有专门编写代码来访问errno,是否有任何方法可以访问errno。不确定这是否有意义。@Ryan:在这种情况下,您可能需要创建一个额外的存根库,其中包含一个
get\u errno
函数或类似函数,该函数只返回
errno
的值(或地址)。或者,您可以使用glibc上的
errno\u location
功能,该功能是
errno
的后端,但这不是一种可移植的设计。喜欢存根的想法。。那么,瑞安,你为什么不能通过它的地址找到厄尔诺?那么
dlsym()
呢?或者我猜问题是你需要在映像的运行时列表中已经打开的库。。。