linux errno 问题?

来源:百度知道 编辑:UC知道 时间:2024/07/12 15:29:46
在多线程中errno定义如下
extern int *__errno_location()
define errno (*__errno_location ())

第一行是声明一个函数__errno_location,返回整形指针,参数没有,
第二行是什么意思,没有看明白,定义errno为什么?
请教达人
只有20分,全送了,谢谢
其实我知道是返回一个地址,主要是那个语法,怎么那么写?

errno实际上,并不是我们通常认为的是个整型数值,而是通过整型指针来获取值的。这个整型就是线程安全的。

另外,宏之所以这样实现,是因为标准库规定了必须能够通过&errno方式取得保存错误代码的变量的地址,因此 __errno_location()函数的返回值是指针,并把宏定义为解引用函数返回的地址*__errno_location()。如果 __errno_location直接返回int类型,此时就无法取得保存错误代码的变量的地址。

使用TLS
多线程运行库
首先,errno必须成为各个线程的私有成员。在glibc中,errno被定义为一个宏,如下:

#define errno (*__errno_location ())

函数__errno_location在不同的库版本下有不同的定义,在单线程版本中,它仅直接返回了全局变量errno的地址。而在多线程版本中,不同线程调用__errno_location返回的地址则各不相同。在MSVC中,errno同样是一个宏,其实现方式和glibc类似。