Linux 错误码
目录
- 一、概述
- 二、含义
- 三、错误处理函数
- 1、IS_ERR
- 2、strerr、perror
一、概述
在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。
为了开发者更好地处理系统错误,内核中预定义的错误几乎涵盖了我们可能遇到的所有问题。一些错误的宏定义在 include/uapi/asm-generic/errno-base.h,还有一部分定义在 include/uapi/asm-generic/errno-base.h 中。
当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给 errno 变量,每一个进程都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号。
只有当系统调用或者调用 lib 函数时出错,才会置位
errno!
二、含义
| 宏名称 | Value | Description | 含义 |
|---|---|---|---|
| EPERM | 1 | Operation not permitted | 操作不允许 |
| ENOENT | 2 | No such file or directory | 没有这样的文件或目录 |
| ESRCH | 3 | No such process | 没有这样的过程 |
| EINTR | 4 | Interrupted system call | 系统调用被中断 |
| EIO | 5 | I/O error | I/O 错误 |
| ENXIO | 6 | No such device or address | 没有这样的设备或地址 |
| E2BIG | 7 | Arg list too long | 参数列表太长 |
| ENOEXEC | 8 | Exec format error | 执行格式错误 |
| EBADF | 9 | Bad file number | 坏的文件描述符 |
| ECHILD | 10 | No child processes | 没有子进程 |
| EAGAIN | 11 | Try again | 资源暂时不可用 |
| ENOMEM | 12 | Out of memory | 内存溢出 |
| EACCES | 13 | Permission denied | 拒绝许可 |
| EFAULT | 14 | Bad address | 错误的地址 |
| ENOTBLK | 15 | Block device required | 块设备请求 |
| EBUSY | 16 | Device or resource busy | 设备或资源忙 |
| EEXIST | 17 | File exists | 文件存在 |
| EXDEV | 18 | Cross-device link | 无效的交叉链接 |
| ENODEV | 19 | No such device | 设备不存在 |
| ENOTDIR | 20 | Not a directory | 不是一个目录 |
| EISDIR | 21 | Is a directory | 是一个目录 |
| EINVAL | 22 | Invalid argument | 无效的参数 |
| ENFILE | 23 | File table overflow | 打开太多的文件系统 |
| EMFILE | 24 | Too many open files | 打开的文件过多 |
| ENOTTY | 25 | Not a tty device | 不是 tty 设备 |
| ETXTBSY | 26 | Text file busy | 文本文件忙 |
| EFBIG | 27 | File too large | 文件太大 |
| ENOSPC | 28 | No space left on device | 设备上没有空间 |
| ESPIPE | 29 | Illegal seek | 非法移位 |
| EROFS | 30 | Read-only file system | 只读文件系统 |
| EMLINK | 31 | Too many links | 太多的链接 |
| EPIPE | 32 | Broken pipe | 管道破裂 |
| EDOM | 33 | Math argument out of domain | 数值结果超出范围 |
| ERANGE | 34 | Math result not representable | 数值结果不具代表性 |
| EDEADLK | 35 | Resource deadlock would occur | 资源死锁错误 |
| ENAMETOOLONG | 36 | Filename too long | 文件名太长 |
| ENOLCK | 37 | No record locks available | 没有可用锁 |
| ENOSYS | 38 | Function not implemented | 功能没有实现 |
| ENOTEMPTY | 39 | Directory not empty | 目录不空 |
| ELOOP | 40 | Too many symbolic links encountered | 符号链接层次太多 |
| EWOULDBLOCK | 41 | Same as EAGAIN | 和 EAGAIN 一样 |
| ENOMSG | 42 | No message of desired type | 没有期望类型的消息 |
| EIDRM | 43 | Identifier removed | 标识符删除 |
| ECHRNG | 44 | Channel number out of range | 频道数目超出范围 |
| EL2NSYNC | 45 | Level 2 not synchronized | 2 级不同步 |
| EL3HLT | 46 | Level 3 halted | 3 级中断 |
| EL3RST | 47 | Level 3 reset | 3 级复位 |
| ELNRNG | 48 | Link number out of range | 链接数超出范围 |
| EUNATCH | 49 | Protocol driver not attached | 协议驱动程序没有连接 |
| ENOCSI | 50 | No CSI structure available | 没有可用 CSI 结构 |
| EL2HLT | 51 | Level 2 halted | 2 级中断 |
| EBADE | 52 | Invalid exchange | 无效的交换 |
| EBADR | 53 | Invalid request descriptor | 请求描述符无效 |
| EXFULL | 54 | Exchange full | 交换充分 |
| ENOANO | 55 | No anode | 没有阳极 |
| EBADRQC | 56 | Invalid request code | 无效的请求代码 |
| EBADSLT | 57 | Invalid slot | 无效的槽 |
| EDEADLOCK | 58 | Same as EDEADLK | 和 EDEADLK 一样 |
| EBFONT | 59 | Bad font file format | 错误的字体文件格式 |
| ENOSTR | 60 | Device not a stream | 设备不是字符流 |
| ENODATA | 61 | No data available | 无可用数据 |
| ETIME | 62 | Timer expired | 计时器过期 |
| ENOSR | 63 | Out of streams resources | 流资源溢出 |
| ENONET | 64 | Machine is not on the network | 机器不上网 |
| ENOPKG | 65 | Package not installed | 没有安装软件包 |
| EREMOTE | 66 | Object is remote | 对象是远程的 |
| ENOLINK | 67 | Link has been severed | 联系被切断 |
| EADV | 68 | Advertise error | 广告的错误 |
| ESRMNT | 69 | Srmount error | srmount 错误 |
| ECOMM | 70 | Communication error on send | 发送时的通讯错误 |
| EPROTO | 71 | Protocol error | 协议错误 |
| EMULTIHOP | 72 | Multihop attempted | 多跳尝试 |
| EDOTDOT | 73 | RFS specific error | RFS 特定的错误 |
| EBADMSG | 74 | Not a data message | 非数据消息 |
| EOVERFLOW | 75 | Value too large for defined data type | 值太大,对于定义数据类型 |
| ENOTUNIQ | 76 | Name not unique on network | 名不是唯一的网络 |
| EBADFD | 77 | File descriptor in bad state | 文件描述符在坏状态 |
| EREMCHG | 78 | Remote address changed | 远程地址改变了 |
| ELIBACC | 79 | Cannot access a needed shared library | 无法访问必要的共享库 |
| ELIBBAD | 80 | Accessing a corrupted shared library | 访问损坏的共享库 |
| ELIBSCN | 81 | A .lib section in an .out is corrupted | 库段 .out 损坏 |
| ELIBMAX | 82 | Linking in too many shared libraries | 试图链接太多的共享库 |
| ELIBEXEC | 83 | Cannot exec a shared library directly | 不能直接执行一个共享库 |
| EILSEQ | 84 | Illegal byte sequence | 无效的或不完整的多字节或宽字符 |
| ERESTART | 85 | Interrupted system call should be restarted | 应该重新启动中断的系统调用 |
| ESTRPIPE | 86 | Streams pipe error | 流管错误 |
| EUSERS | 87 | Too many users | 用户太多 |
| ENOTSOCK | 88 | Socket operation on non-socket | 套接字操作在非套接字上 |
| EDESTADDRREQ | 89 | Destination address required | 需要目标地址 |
| EMSGSIZE | 90 | Message too long | 消息太长 |
| EPROTOTYPE | 91 | Protocol wrong type for socket | socket 协议类型错误 |
| ENOPROTOOPT | 92 | Protocol not available | 协议不可用 |
| EPROTONOSUPPORT | 93 | Protocol not supported | 不支持的协议 |
| ESOCKTNOSUPPORT | 94 | Socket type not supported | 套接字类型不受支持 |
| EOPNOTSUPP | 95 | Operation not supported on transport | 不支持的操作 |
| EPFNOSUPPORT | 96 | Protocol family not supported | 不支持的协议族 |
| EAFNOSUPPORT | 97 | Address family not supported by protocol | 协议不支持的地址 |
| EADDRINUSE | 98 | Address already in use | 地址已在使用 |
| EADDRNOTAVAIL | 99 | Cannot assign requested address | 无法分配请求的地址 |
| ENETDOWN | 100 | Network is down | 网络瘫痪 |
| ENETUNREACH | 101 | Network is unreachable | 网络不可达 |
| ENETRESET | 102 | Network dropped | 网络连接丢失 |
| ECONNABORTED | 103 | Software caused connection | 软件导致连接中断 |
| ECONNRESET | 104 | Connection reset by | 连接被重置 |
| ENOBUFS | 105 | No buffer space available | 没有可用的缓冲空间 |
| EISCONN | 106 | Transport endpoint | 传输端点已经连接 |
| ENOTCONN | 107 | Transport endpoint | 传输终点没有连接 |
| ESHUTDOWN | 108 | Cannot send after transport | 传输后无法发送 |
| ETOOMANYREFS | 109 | Too many references | 太多的参考 |
| ETIMEDOUT | 110 | Connection timed | 连接超时 |
| ECONNREFUSED | 111 | Connection refused | 拒绝连接 |
| EHOSTDOWN | 112 | Host is down | 主机已关闭 |
| EHOSTUNREACH | 113 | No route to host | 没有主机的路由 |
| EALREADY | 114 | Operation already | 已运行 |
| EINPROGRESS | 115 | Operation now in | 正在运行 |
| ESTALE | 116 | Stale NFS file handle | 陈旧的 NFS 文件句柄 |
| EUCLEAN | 117 | Structure needs cleaning | 结构需要清洗 |
| ENOTNAM | 118 | Not a XENIX-named | 不是 XENIX 命名的 |
| ENAVAIL | 119 | No XENIX semaphores | 没有 XENIX 信号量 |
| EISNAM | 120 | Is a named type file | 是一个命名的文件类型 |
| EREMOTEIO | 121 | Remote I/O error | 远程输入/输出错误 |
| EDQUOT | 122 | Quota exceeded | 超出磁盘配额 |
| ENOMEDIUM | 123 | No medium found | 没有磁盘被发现 |
| EMEDIUMTYPE | 124 | Wrong medium type | 错误的媒体类型 |
| ECANCELED | 125 | Operation Canceled | 取消操作 |
| ENOKEY | 126 | Required key not available | 所需键不可用 |
| EKEYEXPIRED | 127 | Key has expired | 关键已过期 |
| EKEYREVOKED | 128 | Key has been revoked | 关键被撤销 |
| EKEYREJECTED | 129 | Key was rejected by service | 关键被拒绝服务 |
| EOWNERDEAD | 130 | Owner died | 所有者死亡 |
| ENOTRECOVERABLE | 131 | State not recoveable | 状态不可恢复 |
| ERFKILL | 132 | Operation not possible due to RF-kill | 由于 RF-kill 而无法操作 |
| EHWPOISON | 133 | Memory page has hardware error | 内存页有硬件错误 |
三、错误处理函数
1、IS_ERR
对于一个指针,有三种类型:
- 合法指针:合法指针是指指向有效内存地址的指针
- NULL:NULL 指针是一个特殊的指针值,它不指向任何有效的内存地址
- 错误指针:错误指针是指指向无效、未定义或未分配内存的指针
在 Linux 内核源码中实现了指针错误的处理机制,相关的函数接口有:IS_ERR()、PTR_ERR()、ERR_PTR() 等,其函数的源码在 include/linux/err.h 中,如下所示:

如上所示,IS_ERR() 函数其实就是判断指针是否出错,如果指针指向了内核空间的最后一页,就说明指针是一个无效指针,如果指针并不是落在内核空间的最后一页,就说明这个指针是有效的。无效的指针会表示成一种负数的错误码,如果想知道这个指针是哪个错误码,就用 PTR_ERR() 函数进行转化。
2、strerr、perror
许多不同的函数库都在失败时设置全局变量 errno 的值来指明失败原因。值得注意的是函数报告出错后必须立刻检查 errno 变量,因为它有可能被下一个函数调用所覆盖。
有两个非常有用的函数可以用来报告出现的错误:
- strerr
该函数可以将对应的 errno 转换成适合我们查看的字符串信息,其函数原型如下所示:
#include <string.>char *strerror(int errnum);
使用实例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>int main(void)
{int fd = open("test.txt", O_RDONLY);if (fd == -1) {printf("Error: %s\n", strerror(errno));return -1;}close(fd);return 0;
}// 输出:Error: No such file or directory
- perror
调用此函数不需要传入 errno,函数内部会自己去获取 errno 变量的值,调用此函数会直接将错误提示字符串打印出来,而不是返回字符串,除此之外还可以在输出的错误提示字符串之前加入自己的打印信息,函数原型如下所示:
#include <stdio.h>void perror(const char *s);
使用实例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>int main(void)
{int fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("open error");return -1;}close(fd);return 0;
}// 输出:open error: No such file or directory
相关文章:
Linux 错误码
目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。 为了开发者更好…...
《向量数据库指南》——开源社区与商业化的平衡
开源社区与商业化的平衡 Lynn:我觉得这个说的特别好,因为开发者工具其实有很多,但是事实上真正去做开源的这种社区的,尤其是做的比较大的,其实这样的企业还是比较少的。那么当初在起步的时候就这么坚定的去选择开源,然后这么短的时间能获得这么多产品反馈。其实让我想到那…...
记录一次echarts图表大数据量轮询刷新页面卡死问题的优化
项目场景: 在我们的项目架构中,集成的Echarts图表组件采用了折线图,业务需求即每300毫秒自动更新图表上的数据,并且每一次的数据点数量达到了约700个,折线图刷新的很快,每300毫秒就要刷新数据 问题描述 开发过程中发现在这种数据量请求频率下,大概2个小时左右就会导致…...
补录:day023-回溯法
40.组合II 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 思路:组合题目二,这个题…...
【物联网】(防水篇)电子产品如何做到IPX7级别的防水?
电子产品如何做到IPX7级别的防水? 要使电子产品达到 IPX7 级别的防水,通常需要以下几个方面的措施: 1. 密封设计: 在产品的外壳连接处、接口、按键等部位,采用高质量的密封材料,如橡胶垫圈、硅胶密封圈等…...
JDK版本切换 - Windows
JDK 下载 点我跳转 - JDK下载官网 可以切换网址后面的JDK版本来跳转到不同的JDK版本下载页面 JDK 安装 双击exe文件即可安装最好是使用默认路径安装, 几个版本的JDK加起来也就1G如果双击exe文件没反应的话, 可以用**7-zip**解压出相应的文件 下载安装**7-zip**** - 默认路…...
STM32-IIC协议详解
一、IIC简介 IC(Inter-Integrated Circuit)协议由飞利浦公司于1980年代开发,是一种用于集成电路间短距离通信的串行协议。它设计用于连接低速外围设备,特别适合于需要简单数据交换的场景。IC协议使用两根信号线:SCL&am…...
Spring事件处理
Spring事件处理 1、核心概念2、线程模型3、监听上下文事件4、自定义事件 💖The Begin💖点点关注,收藏不迷路💖 1、核心概念 ApplicationContext:Spring的核心容器,负责管理Bean的生命周期,并支…...
软设之安全防范体系
安全防范体系的划分: 物理环境的安全性。包括通信线路,物理设备和机房的安全等。物理层的安全主要体现在通信线路的可靠性,软硬件设备的安全性,设备的备份,防灾害能力,防干扰能力,设备的运行环…...
【Python】PyWebIO 初体验:用 Python 写网页
目录 前言1 使用方法1.1 安装 Pywebio1.2 输出内容1.3 输入内容 2 示例程序2.1 BMI 计算器2.2 Markdown 编辑器2.3 聊天室2.4 五子棋 前言 前两天正在逛 Github,偶然看到一个很有意思的项目:PyWebIo。 这是一个 Python 第三方库,可以只用 P…...
OrangePi AIpro学习3 —— vscode开发昇腾DVPP程序
目录 一、VScode配置 1.1 下载和安装 1.2 安装和配置需要的插件 二、构建项目 2.1 项目架构 2.2 解决代码高亮显示 2.3 测试编译 2.4 总结出最简单的代码 2.5 vscode报错找不到头文件解决方法 三、代码简单讲解 3.1 初始化部分 3.2 拷贝数据到NPU显存中 3.3 准备裁…...
redis的数据结构与对象
简单动态字符串 文章目录 简单动态字符串SDS的定义SDS的结构图示结构SDS字段解析SDS的特点 SDS和字符串的区别常数复杂度获取字符串的长度杜绝缓冲区的溢出减少修改字符串时的内存分配次数二进制安全兼容部分c字符串函数总结 链表链表和链表节点的实现链表节点(list…...
ARM 汇编语言基础
目录 汇编指令代码框架 汇编指令语法格式 数据处理指令 数据搬移指令 mov 示例 立即数的本质 立即数的特点 立即数的使用 算术运算指令 指令格式 add 普通的加法指令 adc 带进位的加法指令 跳转指令 Load/Store指令 状态寄存器指令 基础概念 C 语言与汇编指令的关…...
c语言小知识点小计
c语言小知识点小计 1、运算符的优先级 运算符的优先级是和指针解引用*的优先级相同的,但在代码运行中执行顺序是从后往前的。因此下面代码 int a[10] {1,2,3,4}; int* arr a; printf("%d",*arr);//访问的值是2 //注意:printf("%d&qu…...
《C#面向语言版本编程》C# 13 中的新增功能
将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 预览版 SDK 尝试这些功能。若想在.NET项目中尝试使用C#的最新预览版特性,可以按照以下步骤来升级你的项目语言版本: .打开项目文件: 找…...
0成本通过Hugo和GitHub Pages搭建博客
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 使用 Chocolatey 安装 Hugo Chocolatey 是一个 Windows 软件包管理器,使用 PowerShell 和 NuGet 作为基础。它可以自动化软件的安装、升级和卸载过…...
Ollama 可以玩 GLM4和CodeGeeX4了
最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…...
浅析C++指针与引用的关系
前言: 在实践中指针与引用相辅相成,功能相互叠加,但各有各的特点,互相不可替代!!!...
Python面试宝典第31题:字符串反转
题目 编写一个函数,其作用是将输入的字符串反转过来,输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组,并使用O(1)的额外空间解决这一问题。备注:s[i]都是ASCII码表中的可打印…...
【深入理解SpringCloud微服务】深入理解微服务中的远程调用,并手写一个微服务RPC框架
【深入理解SpringCloud微服务】深入理解微服务中的远程调用,并手写一个微服务RPC框架 远程过程调用微服务中的RPC框架如何实现一个微服务中的RPC框架接口扫描生成代理对象代理对象处理逻辑 手写一个微服务RPC框架RPCClientEnableRPCClientMicroServiceRPCClientRegi…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
