如果我想做的不是好主意或不受支持,请随时告诉我。我正在尝试将各种系统库(libc.so.6
,libpthread.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中。
如果有办法调用标准库,那将是理想的。
答案 0 :(得分:0)
errno
不是像linux这样的多线程环境中的全局每进程变量(就像以前一样),每个线程有一个不同的errno
伪变量(实际上errno
是一个#include <errno.h>
中定义的宏。回答您的问题,从先前的系统调用中保存errno
的最佳和最简单的方法是在系统调用完成后立即复制errno
。您甚至可以在系统调用周围创建一个包装器,将errno值存储在循环缓冲区中,这样您就可以获得最后一个,从前到后,依此类推,直到达到某个固定值。由于存储所有这些值需要一定量的内存,因此系统中没有为其调用任何内容。此外,errno
值与一个线程进行的最后一次系统调用相关联,因此您必须决定如何以及何时进行系统调用,您还可以决定是否要存储并且当错误的值。