博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
errno的陷阱
阅读量:7250 次
发布时间:2019-06-29

本文共 599 字,大约阅读时间需要 1 分钟。

hot3.png

看看这段代码,有问题吗?

func();

if (0 != errno) {

    printf("something wrong!\n");

}

我们在调用某些系统函数的时候,经常会通过errno来判断是否出错,上面的写法对吗?

错!!!

因为errno只有在调用失败的时候才会被修改,调用成功的时候不会被修改;

当errno==0的时候,我们不能确定调用成功,也有可能是前面代码把errno设置成了0;

当errno<0的时候,我们不能确定调用失败,也有可能是上次调用失败遗留下来的结果;

所以,正确的做法是

1)如果函数本身返回一个指示调用成功与否的值,则先用这个值判断失败,如果确定失败,再根据errno判断失败类型

res = func();

if(res==某个失败值) {

    printf("errno=%d\n", errno);

}

2) 调用函数前先手动设置errno=0

errno = 0;

func();

这个时候errno就能说明问题了

if( 0 == errno )

    printf("succeed");

else

    printf("failed");

总之,记住一句话:errno是在已经知道出错了的情况下,表示出错类型的;最好不要拿它来作为判断是否出错的依据;

顺便,引用一篇文章

转载于:https://my.oschina.net/mayqlzu/blog/98508

你可能感兴趣的文章
MyExcel 2.1.2 版本发布,重要 Bug 修复
查看>>
广汽与蔚来达成合作,将共同投资12.8亿元创立新能源汽车公司
查看>>
量子力学,整合了三种自然相互作用力
查看>>
亚马逊新专利,让无人机运送充电器为电动车充电
查看>>
HTC将Viveport推向全球,这是要“反击”Valve的节奏?
查看>>
【深度学习不是犯罪】欧盟祭出最严数据保护法:专家解读 GDPR
查看>>
浅谈SQL Server 对于内存的管理
查看>>
喜报销发布V2.4,圣诞焕新装,新增“专项费用报销”审批,集成京东商城
查看>>
陈天奇团队新研究:自动优化深度学习工作负载
查看>>
你的无人机快递来了?小心被查“水表”
查看>>
收录 Uboot 详解
查看>>
MongoDB数据库的索引操作(转)
查看>>
线程的实现
查看>>
重建日志文件
查看>>
鱼鹰软件荣获“北京广告产业发展30周年”杰出贡献单位奖
查看>>
四、oracle基本sql语句和函数详解
查看>>
中合国创杯2017年创客中国互联网+创新创业大赛复赛成功举办 20各项目入围总决赛...
查看>>
UVAoj 11324 - The Largest Clique(tarjan + dp)
查看>>
使用Matplotlib绘制正余弦函数、抛物线
查看>>
四位辉光管时钟-学长毕设
查看>>