函数ERR_PTR,PTR_ERR还有IS_ERR理解

转载 2012年03月30日 13:55:12
http://hi.baidu.com/coffeelinux/blog/item/a7e6911a9c5c34d2ac6e75cd.html
2008-11-20 16:53

      许多的内核函数需要返回一个指针,但是函数的调用可能失败,一般我们处理这样的情形都是返回一个NULL指针,就像malloc或kmalloc在没有获得指定的空间申请时的返回值一样。但是有时我们想知道导致函数失败的原因,但是返回NULL就显得信息不够。因此有些函数返回一个实际的错误编码以便对引起错误的原因做一些处理。很多内核接口通过把错误值编码到一个指针值中来返回错误信息。当处理这样的函数时,判断是否成功调用就不能是简单的和NULL进行比较。为了方便使用这样的类型接口,2.6的内核在linux/err.h中实现了三个内联函数:

#define MAX_ERRNO 4095

#ifndef __ASSEMBLY__

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)

static inline void *ERR_PTR(long error)
{
return (void *) error;
}

static inline long PTR_ERR(const void *ptr)
{
return (long) ptr;
}

static inline long IS_ERR(const void *ptr)
{
return IS_ERR_VALUE((unsigned long)ptr);
}

所幸的是,内核返回的指针一般是指向页面的边界(4K边界),即

ptr & 0xfff == 0


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

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


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


相关文章推荐

Linux中IS_ERR()函数的理解

在Linux源码中的fs部分,经常会碰到这样的函数(位于kernel/include/linux/fs.h): /*  * Kernel> static>      retval = PT...

ERR_PTR()

ERR_PTR():产生错误地址 IS_ERR():判断地址是否错误 PTR_ERR():还原错误码 linux 驱动程序中往往会在产生错误时对错误调用PTR_ERR]进行转换,如下所示 ...

IS_ERR()函数详解

内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。 1)合法指针...

对内核源码中IS_ERR的理解

今天在看内核源码时,看到一个判断指针是否是错误指针或无效指针的函数IS_ERR(2.6.11内核,include/linux/err.h中),其源码如下:    static inline long...

javax.mail.AhenticationFailedException: 535 Err / A secure connection is requiered(java发邮件)

Java发邮件的几种方式:JavaMail Commons Email Spring Mail实验场景: Spring Mail、Web Project 具体描述:邮件服务器: smtp.qq.com...

IS_ERR()说明

感谢fudan_abc的分享,本篇文章选自他的《Linux那些事儿之我是Hub(3)一样的精灵不一样的API》 转贴地址:http://blog.csdn.net/fudan_abc/archive...

Mysql [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause

select version(); # 5.7.17常规查询报错: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY ...

linux内核中的IS_ERR

linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR() 在看内核源码的时候,经常会遇到IS_ERR,比如在 linux/arch/arm/kernel/sys_arm.c中 ...

[知其然不知其所以然-26] Why shouldn't you use IS_ERR_VALUE

IS_ERROR_VALUE should only be used for pointer validation, while if(ret) could be used to check the ...

IS_ERR()说明

感谢fudan_abc的分享,本篇文章选自他的《Linux那些事儿之我是Hub(3)一样的精灵不一样的API》              人的无聊,有时候很难用语言表达.以下关于IS_ERR的文...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数ERR_PTR,PTR_ERR还有IS_ERR理解
举报原因:
原因补充:

(最多只允许输入30个字)