一 errno出现的原因
由于一般的函数返回值只会返回执行成功与否,根据返回值并不能得到出错的真正原因,还有一种情况是返回值可以返回任何值,比如-1也是合法的,这时errno就出现了,记录具体的错误原因。它由libc定义:
int errno = 0;
是一个int类型的变量。
二 常见的使用误区
- 根据errno来判断执行是否成功
- errno判断位置不对
if (somecall() == -1) {
printf("somecall() failed\n");
if (errno == ...) { ... }
}
这样的例子并不能得到somecall这个函数的运行所产生的错误代码
,因为很可能是printf这个函数产生的。正确的做法是errno的判断应该紧随函数调用之后。
- errno线程安全问题
if (somecall() == -1) {
if (errno == ...) { ... }
}
如果是多线程的,可能执行完
somecall() 后刚好进程切换,切换到同应用中的其他线程,其他线程可能调用库函数修改了errno,如果errno又不是线程局部变量,这时再切换到本线程执行,结果显然是不正确的。
- 哪些函数会设置errno?
基于上述原因,个人认为errno并不是一种很好的存在,使用时一定要非常谨慎。