C 的errno

1.  errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义

2. 

</pre>errno - number of last error<pre name="code" class="cpp"><pre name="code" class="cpp">if (somecall() == -1) {
printf("somecall() failed\n");
if (errno == ...) { ... }
}


 

这样的例子并不能得到somecall这个函数的运行所产生的 错误代码,因为很可能是printf这个函数产生的。

if (somecall() == -1) {
    int errsv = errno;
    printf("somecall() failed\n");
    if (errsv == ...) { ... }
}

这样才能真正得到运行somecall函数所带来的错误代码。
注意:只有当一个 库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之 ,只有当被调用的函数提示有错误发生时检查errno的值才有意义
3. 查看 错误代码errno是调试程序的一个重要方法。
   
perror和strerror函数都是用来打印错误提示信息的,它们的原型分别是:

char *strerror(int errnum);

它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回"Cannot allocate memory"。

void  perror(const char *s);

它先打印s指向的字符串,然后输出当前errno值所对应的错误提示信息,例如当前errno若为12,调用perror("ABC"),会输出"ABC: Cannot allocate memory"。

4. 说明
    
4.1、如果系统调用或库函数正确执行的话,errno的值是不会被清零(置0,注意这里是不会被清零,不是不会被改变)的,假若执行函数A的时候发生了错误errno被改变,接下来直接执行函数B,如果函数B正确执行的话,errno还保留函数A发生错误时被设置的值。所以,在利用errno之前,最好先对函数的返回值进行判断,看是否发生了错误,返回值错误再利用errno判断时哪里发生了错误。所以如果一个函数无法从返回值上判断正误,而只能通过errno来判断出错,那你在调用它之前必须手动将errno清零!

4.2、系统调用或库函数正确执行,并不保证errno的值不会被改变!

4.3、任何错误号(即发生错误时errno的取值)都是非0的。

综上所述,当需要用errno来判断函数是否正确执行的时候,最好先将errno清零,函数执行结束时,通过其返回值判断函数是否正确执行,若没有正确执行,再根据errno判断时哪里发生了错误


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值