首页 / 操作系统 / Linux / Linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR()
在看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 <linux/compiler.h>#include <asm/errno.h>/* * 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 */