C语言多线程中使用errno全局变量的问题

        在C语言中,不管理Unix/Linux还是Windows下,每次系统调用或库函数调用后,如果判断返回值不对,需要调用errno全局变量来判断具体错误。既然errno是全局变量,那么如果在多线程函数中它不会被别的线程充掉吗?显然不是,通过查看相关定义,仅以Unix/Linux为例,可以得出两个结论:
1. errno是per-thread的,也就是说errno定义和存储是对于线程而言的,与别的线程毫无关系;
2. errno调用最终是一个调用,每使用一次都会调用一次函数。
与错误处理相关的两个函数perror,strerror内部调用的也都是线程存储的变量,看看FreeBSD中对strerror的定义:
char*
strerror(int err)
{
   static char msg[32];
   int i;
   for(i=0;errtab[i].msg !=NULL;i++)
    if(errtab[i].err == err)
       return (errtab[i].msg);
   sprintf(msg,"unknown error (%d)",err);
}

errtab数组是定义的本线程的全局变量。

Linux中实现的细节可参看以下文章,讲得比较透彻:
https://blog.csdn.net/weixin_35695879/article/details/89530417

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值