errno详解

作用

errno 是 error number 的缩写,意味系统调用错误码。

如果系统调用返回成功,errno 有可能但不一定会置0;而系统调用出错时,errno 必定会被设为对应的错误编号。因此,强迫症患者可以在调用系统调用之前,手动将 errno 置0。不过,如果系统调用返回成功,谁会闲着没事去看 errno 呢?

相关函数

一般来说,我们是不是需要了解每个 errno 的编号是什么意思的。我们会使用两个C库函数帮我们翻译 errno 的意思就可以了。

他们分别是:

#include <string.h>
char *strerror(int errnum);

#include <stdio.h>
void perror(const char *msg);

多线程

在没有多线程以前,errno 其实就是一个全局变量。这是很好理解的,不过已经是过去式了。

因为每个线程都有可能会调用系统调用,那么后来的错误,就会把前面的错误覆盖掉。如果我们不能保证 errno 的可靠性,那 errno 还有什么意义?

所以,它变了。

  1. 在多线程编程时,需要包含头文件 #include <errno.h>
  2. errno 不再是一个全局变量了,现在它已经变成了一个宏

虽然 errno 变了,但它依然是一个左值(左值就是可以写成 “左值 = 右值” 的形式)。
那这个宏是什么鬼呢?不用等下回分解,我们继续看:

extern int *__errno_location(void);

#define errno (*__errno_location())

首先,声明了来自外部的函数 __errno_location();注意哦,这个函数的返回值是一个函数指针,这个指针指向线程自己的 errno 的位置,通过对这个指针解引用,就可以访问线程唯一的 errno。

所以,errno 被定义为 (*__errno_location())

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值