#defineIS_ERR_VALUE(x)unlikely((x)>=(unsigned long)-MAX_ERRNO)staticinlinevoid*__must_checkERR_PTR(long error){return(void*)error;}staticinline long __must_checkPTR_ERR(constvoid*ptr){return(long)ptr;}staticinline long __must_checkIS_ERR(constvoid*ptr){returnIS_ERR_VALUE((unsigned lon...
1. Linux的errno和指针 常见的Linux函数返回值类型包括整型和指针,内核中这两种返回值类型的函数会互相调用。Linux的errno为整型,为了与errno对应,Linux将指针分为3种: - 空指针:NULL,地址为0 - 异常指针:地址空间的高4095个字节。0xfffff001 - 0xffffffff(32位)和0xfffffffffffff001 - 0xffffffffffffffff(64...
*/#defineMAX_ERRNO 4095#ifndef__ASSEMBLY__#defineIS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)staticinlinevoid* __must_checkERR_PTR(longerror) {return(void*) error; }staticinlinelong__must_checkPTR_ERR(constvoid*ptr){return(long) ptr; }staticinlinelong__must_checkIS_ERR...
void*ERR_PTR(longerror);longIS_ERR(constvoid*ptr);longPTR_ERR(constvoid*ptr); 第一个函数实际上把错误值作为指针返回。假若函数在内存申请失败后要执行语句return -ENOMEM;,则必须改为这样的语句:return ERR_PTR(-ENOMEM);。 第二个函数用于检查返回值是否是指针错误:if (IS_ERR(foo))。最后一个函数返...
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);
与IS_ERR配套使用的宏还有PTR_ERR和ERR_PTR,分别用于将指针转换成错误码,和把错误码转换成指针。下面是从Linux源代码中找到的相关源代码,出自:include/linux/err.h /* * Kernel pointers have redundant information, so we can use a * scheme where we can return either an error code or a dentry ...
static inline void *ERR_PTR(long error) { return (void *) error; } /* 将指针转化为错误号 */ static inline long PTR_ERR(const void *ptr) { return (long) ptr; } /* 判断返回的指针是错误信息还是实际地址,即指针是否落在最后一页 ...
ERR_PTR,PTR_ERR还有IS_ERR函数详解 内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。 1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即ptr & 0xfff == 0...
几个内核函数:filp_open、filp_read、IS_ERR、ERR_PTR、PTR_ERR,程序员大本营,技术文章内容聚合第一站。
Linux内核IS_ERR/ERR_PTR/PTR_ERR 对于一个指针,一般分为3类:1、有效指针;2、NULL;3、非法指针 IS_ERR/ERR_PTR/PTR_ERR均定义在include/linux/err.h文件中。 1、IS_ERR static inline bool __must_check IS_ERR(__force const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); } 1 2 ...