0


Linux 错误码

目录


一、概述

在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。

为了开发者更好地处理系统错误,内核中预定义的错误几乎涵盖了我们可能遇到的所有问题。一些错误的宏定义在

include/uapi/asm-generic/errno-base.h

,还有一部分定义在

include/uapi/asm-generic/errno-base.h

中。

当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给

errno

变量,每一个进程都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号。

只有当系统调用或者调用 lib 函数时出错,才会置位

errno

二、含义

宏名称ValueDescription含义EPERM1Operation not permitted操作不允许ENOENT2No such file or directory没有这样的文件或目录ESRCH3No such process没有这样的过程EINTR4Interrupted system call系统调用被中断EIO5I/O errorI/O 错误ENXIO6No such device or address没有这样的设备或地址E2BIG7Arg list too long参数列表太长ENOEXEC8Exec format error执行格式错误EBADF9Bad file number坏的文件描述符ECHILD10No child processes没有子进程EAGAIN11Try again资源暂时不可用ENOMEM12Out of memory内存溢出EACCES13Permission denied拒绝许可EFAULT14Bad address错误的地址ENOTBLK15Block device required块设备请求EBUSY16Device or resource busy设备或资源忙EEXIST17File exists文件存在EXDEV18Cross-device link无效的交叉链接ENODEV19No such device设备不存在ENOTDIR20Not a directory不是一个目录EISDIR21Is a directory是一个目录EINVAL22Invalid argument无效的参数ENFILE23File table overflow打开太多的文件系统EMFILE24Too many open files打开的文件过多ENOTTY25Not a tty device不是 tty 设备ETXTBSY26Text file busy文本文件忙EFBIG27File too large文件太大ENOSPC28No space left on device设备上没有空间ESPIPE29Illegal seek非法移位EROFS30Read-only file system只读文件系统EMLINK31Too many links太多的链接EPIPE32Broken pipe管道破裂EDOM33Math argument out of domain数值结果超出范围ERANGE34Math result not representable数值结果不具代表性EDEADLK35Resource deadlock would occur资源死锁错误ENAMETOOLONG36Filename too long文件名太长ENOLCK37No record locks available没有可用锁ENOSYS38Function not implemented功能没有实现ENOTEMPTY39Directory not empty目录不空ELOOP40Too many symbolic links encountered符号链接层次太多EWOULDBLOCK41Same as EAGAIN和 EAGAIN 一样ENOMSG42No message of desired type没有期望类型的消息EIDRM43Identifier removed标识符删除ECHRNG44Channel number out of range频道数目超出范围EL2NSYNC45Level 2 not synchronized2 级不同步EL3HLT46Level 3 halted3 级中断EL3RST47Level 3 reset3 级复位ELNRNG48Link number out of range链接数超出范围EUNATCH49Protocol driver not attached协议驱动程序没有连接ENOCSI50No CSI structure available没有可用 CSI 结构EL2HLT51Level 2 halted2 级中断EBADE52Invalid exchange无效的交换EBADR53Invalid request descriptor请求描述符无效EXFULL54Exchange full交换充分ENOANO55No anode没有阳极EBADRQC56Invalid request code无效的请求代码EBADSLT57Invalid slot无效的槽EDEADLOCK58Same as EDEADLK和 EDEADLK 一样EBFONT59Bad font file format错误的字体文件格式ENOSTR60Device not a stream设备不是字符流ENODATA61No data available无可用数据ETIME62Timer expired计时器过期ENOSR63Out of streams resources流资源溢出ENONET64Machine is not on the network机器不上网ENOPKG65Package not installed没有安装软件包EREMOTE66Object is remote对象是远程的ENOLINK67Link has been severed联系被切断EADV68Advertise error广告的错误ESRMNT69Srmount errorsrmount 错误ECOMM70Communication error on send发送时的通讯错误EPROTO71Protocol error协议错误EMULTIHOP72Multihop attempted多跳尝试EDOTDOT73RFS specific errorRFS 特定的错误EBADMSG74Not a data message非数据消息EOVERFLOW75Value too large for defined data type值太大,对于定义数据类型ENOTUNIQ76Name not unique on network名不是唯一的网络EBADFD77File descriptor in bad state文件描述符在坏状态EREMCHG78Remote address changed远程地址改变了ELIBACC79Cannot access a needed shared library无法访问必要的共享库ELIBBAD80Accessing a corrupted shared library访问损坏的共享库ELIBSCN81A .lib section in an .out is corrupted库段 .out 损坏ELIBMAX82Linking in too many shared libraries试图链接太多的共享库ELIBEXEC83Cannot exec a shared library directly不能直接执行一个共享库EILSEQ84Illegal byte sequence无效的或不完整的多字节或宽字符ERESTART85Interrupted system call should be restarted应该重新启动中断的系统调用ESTRPIPE86Streams pipe error流管错误EUSERS87Too many users用户太多ENOTSOCK88Socket operation on non-socket套接字操作在非套接字上EDESTADDRREQ89Destination address required需要目标地址EMSGSIZE90Message too long消息太长EPROTOTYPE91Protocol wrong type for socketsocket 协议类型错误ENOPROTOOPT92Protocol not available协议不可用EPROTONOSUPPORT93Protocol not supported不支持的协议ESOCKTNOSUPPORT94Socket type not supported套接字类型不受支持EOPNOTSUPP95Operation not supported on transport不支持的操作EPFNOSUPPORT96Protocol family not supported不支持的协议族EAFNOSUPPORT97Address family not supported by protocol协议不支持的地址EADDRINUSE98Address already in use地址已在使用EADDRNOTAVAIL99Cannot assign requested address无法分配请求的地址ENETDOWN100Network is down网络瘫痪ENETUNREACH101Network is unreachable网络不可达ENETRESET102Network dropped网络连接丢失ECONNABORTED103Software caused connection软件导致连接中断ECONNRESET104Connection reset by连接被重置ENOBUFS105No buffer space available没有可用的缓冲空间EISCONN106Transport endpoint传输端点已经连接ENOTCONN107Transport endpoint传输终点没有连接ESHUTDOWN108Cannot send after transport传输后无法发送ETOOMANYREFS109Too many references太多的参考ETIMEDOUT110Connection timed连接超时ECONNREFUSED111Connection refused拒绝连接EHOSTDOWN112Host is down主机已关闭EHOSTUNREACH113No route to host没有主机的路由EALREADY114Operation already已运行EINPROGRESS115Operation now in正在运行ESTALE116Stale NFS file handle陈旧的 NFS 文件句柄EUCLEAN117Structure needs cleaning结构需要清洗ENOTNAM118Not a XENIX-named不是 XENIX 命名的ENAVAIL119No XENIX semaphores没有 XENIX 信号量EISNAM120Is a named type file是一个命名的文件类型EREMOTEIO121Remote I/O error远程输入/输出错误EDQUOT122Quota exceeded超出磁盘配额ENOMEDIUM123No medium found没有磁盘被发现EMEDIUMTYPE124Wrong medium type错误的媒体类型ECANCELED125Operation Canceled取消操作ENOKEY126Required key not available所需键不可用EKEYEXPIRED127Key has expired关键已过期EKEYREVOKED128Key has been revoked关键被撤销EKEYREJECTED129Key was rejected by service关键被拒绝服务EOWNERDEAD130Owner died所有者死亡ENOTRECOVERABLE131State not recoveable状态不可恢复ERFKILL132Operation not possible due to RF-kill由于 RF-kill 而无法操作EHWPOISON133Memory 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

变量,因为它有可能被下一个函数调用所覆盖。

有两个非常有用的函数可以用来报告出现的错误:

  1. 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>intmain(void){int fd =open("test.txt", O_RDONLY);if(fd ==-1){printf("Error: %s\n",strerror(errno));return-1;}close(fd);return0;}// 输出:Error: No such file or directory
  1. perror

调用此函数不需要传入

errno

,函数内部会自己去获取

errno

变量的值,调用此函数会直接将错误提示字符串打印出来,而不是返回字符串,除此之外还可以在输出的错误提示字符串之前加入自己的打印信息,函数原型如下所示:

#include<stdio.h>voidperror(constchar*s);

使用实例:

#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#include<stdio.h>#include<errno.h>intmain(void){int fd =open("test.txt", O_RDONLY);if(fd ==-1){perror("open error");return-1;}close(fd);return0;}// 输出:open error: No such file or directory
标签: linux 错误码

本文转载自: https://blog.csdn.net/Teminator_/article/details/141063926
版权归原作者 Projectsauron 所有, 如有侵权,请联系我们删除。

“Linux 错误码”的评论:

还没有评论