Linux内核err.h文件分析

news2024/11/16 4:14:23

在阅读和编写内核相关的代码时,经常会看到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 that's what's 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);
	else
		return 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文件锁恢复被拒绝。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1544812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】商混ERP系统 DictionaryEdit.aspx接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

SpringBoot学习之ElasticSearch下载安装和启动(Windows版)(三十)

本文先写windows下的下载安装和启动,后续有时间再补充其他环境下(Mac、Linux、Docker)的,这里我们后续对ElasticSearch简称为ES,读者习惯这一称呼就好。 一,ES下载 可以百度【ElasticSearch官网】或者直接点击这里的ES官网下载地址:​​​​​ Download Elasticsearch…

Python制作数据可视化大屏

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

平台介绍-搭建赛事运营平台(2)

平台建设的首期就有两个品牌入驻&#xff0c;品牌J和品牌K&#xff0c;第三个品牌正在协商中。 作为一个统一的共享平台&#xff0c;首先要解决的是品牌直接的隔离。 方案一&#xff1a;同服务程序、同库&#xff0c;同表。表中通过字段区分品牌 这是最传统的解决方案。初期开发…

【STM32嵌入式系统设计与开发】——9Timer(定时器中断实验)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;USART1初始化函数(usart1_init())&#xff08;3&#xff09;USART数据发送函数&#xff08; USART1_Send_Data&#xff08;&…

PTAxt的考研路

xt是我院19级专业第一&#xff0c;但他认为保研并不能展示他全部的实力&#xff0c;所以他在22年初试一结束就加入了23考研的队伍中&#xff0c;并且他为了填补我院近些年来无北大研究生的空白&#xff0c;毅然决然决定扛起19级的大旗&#xff0c;在学校百年华诞之际献上他最诚…

elasticsearch 6.8.x 索引别名、动态索引扩展、滚动索引

文章目录 引言索引别名&#xff08;alias&#xff09;创建索引别名查询索引别名删除索引别名重命名索引别名 动态索引&#xff08;index template&#xff0c;动态匹配生成索引&#xff09;新建索引模板新建索引并插入数据索引sys-log-202402索引sys-log-202403索引sys-log-202…

Jakarta项目介绍

概述 在升级Spring Boot到3.0版本以后&#xff0c;或升级Spring到6.0版本以上&#xff0c;会发现应用编译失败或启动失败等问题。 经过排查不难得知&#xff0c;Spring 6或Spring Boot 3&#xff08;实际上依赖于Spring 6&#xff09;不再支持javax.开头的一系列依赖包&#…

【微服务】认识Dubbo+基本环境搭建

认识Dubbo Dubbo是阿里巴巴公司开源的一个高性能、轻量级的WEB和 RPC框架&#xff0c;可以和Spring框架无缝集成。Dubbo为构建企业级微服务提供了三大核心能力&#xff1a; 服务自动注册和发现、面向接口的 远程方法调用&#xff0c; 智能容错和负载均衡官网&#xff1a;https…

初见 链表

前言 在上篇文章重温数组——顺序表 http://t.csdnimg.cn/9DH9M 后&#xff0c;本篇文章让我们认识一种新的数据结构&#xff1a;链表 认识 概念&#xff1a;链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现…

【JavaEE】进程是什么?

文章目录 ✍进程的概念✍进程存在的意义✍进程在计算机中的存在形式✍进程调度 ✍进程的概念 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件传输…

修改 RabbitMQ 默认超时时间

MQ客户端正常运行&#xff0c;突然就报连接错误&#xff0c; 错误信息写的很明确&#xff0c;是客户端连接超时。 不过很疑虑&#xff0c;为什么会出现连接超时呢&#xff1f;代码没动过&#xff0c;网络也ok&#xff0c;也设置了心跳和重连机制。 最终在官网中找到了答案&am…

『笔记』可扩展架构设计之消息队列

前言 众所周知&#xff0c;开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展&#xff0c;低耦合的模块更加容易复用&#xff0c;更易于维护和管理。我们知道&#xff0c;消息队列的主要功能就是收发消息&#xff0c;但是它的作用不仅仅只是解决应用之间的通…

java一和零(力扣Leetcode474)

一和零 力扣原题 给定一个二进制字符串数组 strs 和两个整数 m 和 n&#xff0c;请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中最多有 m 个 0 和 n 个 1。 示例 1&#xff1a; 输入&#xff1a;strs [“10”, “0001”, “111001”, “1”, “0”], m 5, n …

基于GA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

基于BP神经网络的城市空气质量数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 BP神经网络结构 4.2 神经元模型与激活函数 4.3 前向传播过程 4.4反向传播算法及其误差函数 4.5 权重更新规则 4.6 迭代训练 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软…

Qt_day4:2024/3/25

作业1&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

qt table 简易封装,样式美化,以及 合并表格和颜色的区分 已解决

在需求中&#xff0c; 难免会使用 table 进行渲染窗口&#xff0c;做一个简单的封装。美化表格最终效果&#xff01;&#xff01;&#xff01; 代码部分 // 显示 20行 20列CCendDetailsInfoTableWidget* table new CCendDetailsInfoTableWidget(20,10);for (int i 0; i < …