在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