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

时间:2017-01-18 22:23:10

标签: c linux gnu

如果我想做的不是好主意或不受支持,请随时告诉我。我正在尝试将各种系统库(libc.so.6libpthread.so.0等)用于API。 API将调用这些库来访问open(),`close()等...

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

有没有办法在执行一个使用某种类型的库调用设置errno(例如close())的函数后,确定给定线程的errno的当前值?

可能的解决方案:

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

如果有办法调用标准库,那将是理想的。

1 个答案:

答案 0 :(得分:0)

errno不是像linux这样的多线程环境中的全局每进程变量(就像以前一样),每个线程有一个不同的errno伪变量(实际上errno是一个#include <errno.h>中定义的宏。回答您的问题,从先前的系统调用中保存errno的最佳和最简单的方法是在系统调用完成后立即复制errno。您甚至可以在系统调用周围创建一个包装器,将errno值存储在循环缓冲区中,这样您就可以获得最后一个,从前到后,依此类推,直到达到某个固定值。由于存储所有这些值需要一定量的内存,因此系统中没有为其调用任何内容。此外,errno值与一个线程进行的最后一次系统调用相关联,因此您必须决定如何以及何时进行系统调用,您还可以决定是否要存储并且当错误的值。