为了账号安全,请及时绑定邮箱和手机立即绑定

你好,求问关于linux errno问题,如下所示,该如何解决呢?

你好,求问关于linux errno问题,如下所示,该如何解决呢?

白板的微信 2021-07-09 11:11:07
在多线程中errno定义如下extern int *__errno_location()define errno (*__errno_location ())第一行是声明一个函数__errno_location,返回整形指针,参数没有,第二行是什么意思,没有看明白,定义errno为什么?请教达人只有20分,全送了,谢谢其实我知道是返回一个地址,主要是那个语法,怎么那么写?
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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

查看完整回答
反对 回复 2021-07-11
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

使用TLS
多线程运行库
首先,errno必须成为各个线程的私有成员。在glibc中,errno被定义为一个宏,如下:
#define errno (*__errno_location ())
函数__errno_location在不同的库版本下有不同的定义,在单线程版本中,它仅直接返回了全局变量errno的地址。而在多线程版本中,不同线程调用__errno_location返回的地址则各不相同。在MSVC中,errno同样是一个宏,其实现方式和glibc类似。

查看完整回答
反对 回复 2021-07-11
  • 2 回答
  • 0 关注
  • 459 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号