IS_ERR()

本文深入探讨了Linux内核中如何通过返回指针和错误代码来区分函数调用的成功与失败。重点介绍了如何利用内核指针的特性与错误代码范围来判断函数返回值的有效性,以及如何使用ERR_PTR函数来标识无效返回值。通过具体实例分析了错误代码的来源与意义,并阐述了返回NULL与错误指针的区别。
IS_ERR()有一些妙处。
内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。
所幸的是,内核返回的指针一般是指向页面的边界(4K边界),即

ptr & 0xfff == 0


这样ptr的值不可能落在(0xfffff000,0xffffffff)之间,
而一般内核的出错代码也是一个小负数,在-1000到0之间,转变成unsigned long,
正好在(0xfffff000,0xffffffff)之间。因此可以用

(unsigned long)ptr > (unsigned long)-1000L


来判断内核函数的返回值是一个有效的指针,还是一个出错代码。

涉及到的任何一个指针,必然有三种情况,一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针.而所谓的错误指针就是指其已经到达了最后一个page.比如对于32bit的系统来说,内核空间最高地址0xffffffff,那么最后一个page就是指的0xfffff000~0xffffffff(假设4k一个page).这段地址是被保留的,如果超过这个地址,则肯定是错误的。
Linux内核中,出错有多种可能:
include/asm-generic/errno-base.h文件:

#define EPERM            

#define ENOENT            

#define ESRCH            

#define EINTR            

#define EIO               

#define ENXIO            

#define E2BIG            

#define ENOEXEC           

#define EBADF            

#define ECHILD       10     

#define EAGAIN       11     

#define ENOMEM       12     

#define EACCES       13     

#define EFAULT       14     

#define ENOTBLK      15     

#define EBUSY        16     

#define EEXIST       17     

#define EXDEV        18     

#define ENODEV       19     

#define ENOTDIR      20     

#define EISDIR       21     

#define EINVAL       22     

#define ENFILE       23     

#define EMFILE       24     

#define ENOTTY       25     

#define ETXTBSY      26     

#define EFBIG        27     

#define ENOSPC       28     

#define ESPIPE       29     

#define EROFS        30     

#define EMLINK       31     

#define EPIPE        32     

#define EDOM         33     

#define ERANGE       34     

而出错时,往往返回的是-EBUSY,-EINVAL,-ENODEV,-EPIPE,-EAGAIN,-ENOMEM等等,可以看到,这个值实际上是在-1000~0之间的。

对于一个返回指针的函数,我们通常返回NULL表示失败,但是这不能指出那种失败(内存不足?硬件错误还是网络不可达?)
所以返回的时候用ERR_PTR(-ENOME) 等就可以判断,因为这个指针显然不合法
参考 include/iinux/err.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值