Linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR()

2014-11-24 08:47:20 来源: 作者: 浏览: 0

在看Linux内核源码的时候,经常会遇到IS_ERR,比如在 linux/arch/arm/kernel/sys_arm.c中


asmlinkage int sys_execve(char __user *filenamei, char __user * __user *argv,
char __user * __user *envp, struct pt_regs *regs)
{
int error;
char * filename;



filename = getname(filenamei);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = do_execve(filename, argv, envp, regs);
putname(filename);
out:
return error;
}


IS_ERR宏定义在include/linux/err.h,如下所示:


#ifndef _LINUX_ERR_H
#define _LINUX_ERR_H


#include


#include


/*
* Kernel pointers have redundant information, so we can use a
* scheme where we can return either an error code or a dentry
* pointer with the same return value.
*
* This should be a per-architecture thing, to allow different
* error and pointer decisions.
*/
#define IS_ERR_VALUE(x) unlikely((x) > (unsigned long)-1000L)


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);
}


#endif /* _LINUX_ERR_H */


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: