网站内链案例,免费网站推广软件有哪些,wordpress如何压缩图片大小,建设网站需要买什么在阅读和编写内核相关的代码时#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例#xff0c;内核版本为5.15。 这个文件的代码如下#xff1a;
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_ERR_H
#define _L…在阅读和编写内核相关的代码时经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例内核版本为5.15。 这个文件的代码如下
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_ERR_H
#define _LINUX_ERR_H#include linux/compiler.h
#include linux/types.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 normal* pointer with the same return value.** This should be a per-architecture thing, to allow different* error and pointer decisions.*/
#define MAX_ERRNO 4095#ifndef __ASSEMBLY__#define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) (unsigned long)-MAX_ERRNO)static inline void * __must_check ERR_PTR(long error)
{return (void *) error;
}static inline long __must_check PTR_ERR(__force const void *ptr)
{return (long) ptr;
}static inline bool __must_check IS_ERR(__force const void *ptr)
{return IS_ERR_VALUE((unsigned long)ptr);
}static inline bool __must_check IS_ERR_OR_NULL(__force const void *ptr)
{return unlikely(!ptr) || IS_ERR_VALUE((unsigned long)ptr);
}/*** ERR_CAST - Explicitly cast an error-valued pointer to another pointer type* ptr: The pointer to cast.** Explicitly cast an error-valued pointer to another pointer type in such a* way as to make it clear thats whats going on.*/
static inline void * __must_check ERR_CAST(__force const void *ptr)
{/* cast away the const */return (void *) ptr;
}static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr)
{if (IS_ERR(ptr))return PTR_ERR(ptr);elsereturn 0;
}#endif#endif /* _LINUX_ERR_H */
这个文件提供了一套用于处理错误指针的宏和函数。主要部分的解释
#define MAX_ERRNO 4095定义了最大的错误号为4095。
#define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) (unsigned long)-MAX_ERRNO)定义了一个宏用于检查一个值是否在错误号的范围内。
ERR_PTR(long error)这个函数将一个错误号转换为一个错误指针这样就可以将错误信息通过指针返回。
PTR_ERR(const void *ptr)这个函数将一个错误指针转换回对应的错误号。
IS_ERR(const void *ptr)这个函数检查一个指针是否是错误指针。
IS_ERR_OR_NULL(const void *ptr)这个函数检查一个指针是否是错误指针或者NULL指针。
ERR_CAST(const void *ptr)这个函数将一个错误指针强制转换为另一种类型的指针。
PTR_ERR_OR_ZERO(const void *ptr)这个函数检查一个指针如果它是错误指针就返回对应的错误号否则返回0。
这些函数和宏提供了一种机制使得函数可以通过返回指针的方式来返回错误信息。
错误号的部分信息在文件errno.h中 代码如下
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_ERRNO_H
#define _LINUX_ERRNO_H#include uapi/linux/errno.h/** These should never be seen by user programs. To return one of ERESTART** codes, signal_pending() MUST be set. Note that ptrace can observe these* at syscall exit tracing, but they will never be left for the debugged user* process to see.*/
#define ERESTARTSYS 512
#define ERESTARTNOINTR 513
#define ERESTARTNOHAND 514 /* restart if no handler.. */
#define ENOIOCTLCMD 515 /* No ioctl command */
#define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */
#define EPROBE_DEFER 517 /* Driver requests probe retry */
#define EOPENSTALE 518 /* open found a stale dentry */
#define ENOPARAM 519 /* Parameter not supported *//* Defined for the NFSv3 protocol */
#define EBADHANDLE 521 /* Illegal NFS file handle */
#define ENOTSYNC 522 /* Update synchronization mismatch */
#define EBADCOOKIE 523 /* Cookie is stale */
#define ENOTSUPP 524 /* Operation is not supported */
#define ETOOSMALL 525 /* Buffer or request is too small */
#define ESERVERFAULT 526 /* An untranslatable error occurred */
#define EBADTYPE 527 /* Type not supported by server */
#define EJUKEBOX 528 /* Request initiated, but will not complete before timeout */
#define EIOCBQUEUED 529 /* iocb queued, will get completion event */
#define ERECALLCONFLICT 530 /* conflict with recalled state */
#define ENOGRACE 531 /* NFS file lock reclaim refused */#endif
错误号的部分解释如下
ERESTARTSYS (512)系统调用由于接收到一个可以被处理的信号而被中断需要被重新启动。
ERESTARTNOINTR (513)系统调用由于某些原因被中断需要被重新启动但是不需要检查未决的信号。
ERESTARTNOHAND (514)系统调用由于接收到一个不能被当前进程处理的信号而被中断需要被重新启动。
ENOIOCTLCMD (515)没有找到对应的ioctl命令。
ERESTART_RESTARTBLOCK (516)系统调用需要被重新启动但是使用了不同的方法。
EPROBE_DEFER (517)设备驱动程序请求延迟探测。
EOPENSTALE (518)打开操作找到了一个过时的目录项。
ENOPARAM (519)不支持的参数。
EBADHANDLE (521)NFS协议中的非法文件句柄。
ENOTSYNC (522)更新同步不匹配。
EBADCOOKIE (523)Cookie过期。
ENOTSUPP (524)不支持的操作。
ETOOSMALL (525)缓冲区或请求太小。
ESERVERFAULT (526)发生了无法翻译的错误。
EBADTYPE (527)服务器不支持的类型。
EJUKEBOX (528)请求已经启动但在超时前不会完成。
EIOCBQUEUED (529)iocb已经入队将会收到完成事件。
ERECALLCONFLICT (530)与被召回的状态冲突。
ENOGRACE (531)NFS文件锁恢复被拒绝。