ERRNO - Linux手册页
Linux程序员手册 第3部分
更新日期: 2019-10-10
名称
errno-最后的错误数
语法
#包括
说明
头文件定义了整数变量errno,它在发生错误时由系统调用和某些库函数设置,以指示出问题所在。
errno
仅当调用的返回值指示错误时(即,大多数系统调用为-1;大多数库函数为-1或NULL),errno中的值才有意义。成功的功能允许更改errno。任何系统调用或库函数都不会将errno的值设置为零。
对于某些系统调用和库函数(例如getpriority(2)),-1是成功的有效返回。在这种情况下,可以通过在调用之前将errno设置为零来将成功的返回与错误的返回区分开,然后,如果调用返回的状态表明可能发生了错误,请检查errno是否具有非零值。
ISO C标准将errno定义为int类型的可修改左值,并且不能明确声明; errno可能是宏。 errno是线程本地的;在一个线程中设置它不会影响任何其他线程中的值。
Error numbers and names
有效错误号均为正数。头文件为errno中可能出现的每个可能的错误编号定义符号名称。
POSIX.1指定的所有错误名称都必须具有不同的值,但EAGAIN和EWOULDBLOCK可能相同。在Linux上,这两个在所有体系结构上都具有相同的值。
与每个符号名称相对应的错误号在UNIX系统上甚至在Linux上的不同体系结构上都不同。因此,数字值不包括在下面的错误名称列表中。 perror(3)和strerror(3)函数可用于将这些名称转换为相应的文本错误消息。
在任何特定的Linux系统上,都可以使用errno(1)命令(moreutils软件包的一部分)获得所有符号错误名称和相应错误编号的列表:
$ errno -l EPERM 1 Operation not permitted ENOENT 2 No such file or directory ESRCH 3 No such process EINTR 4 Interrupted system call EIO 5 Input/output error ...
errno(1)命令还可用于查找各个错误号和名称,并使用错误描述中的字符串搜索错误,如以下示例所示:
$ errno 2 ENOENT 2 No such file or directory $ errno ESRCH ESRCH 3 No such process $ errno -s permission EACCES 13 Permission denied
List of error names
在下面的符号错误名称列表中,各种名称标记如下:
- *
- POSIX.1-2001:除非另有说明,否则名称由POSIX.1-2001定义,并且在更高的POSIX.1版本中定义。
- *
- POSIX.1-2008:该名称在POSIX.1-2008中定义,但在较早的POSIX.1标准中不存在。
- *
- C99:名称由C99定义。
以下是在Linux上定义的符号错误名称的列表:
- E2BIG
- 参数列表太长(POSIX.1-2001)。
- EACCES
- 权限被拒绝(POSIX.1-2001)。
- EADDRINUSE
- 地址已在使用中(POSIX.1-2001)。
- EADDRNOTAVAIL
- 地址不可用(POSIX.1-2001)。
- EAFNOSUPPORT
- 不支持地址族(POSIX.1-2001)。
- EAGAIN
- 资源暂时不可用(可能与EWOULDBLOCK的值相同)(POSIX.1-2001)。
- EALREADY
- 连接已在进行中(POSIX.1-2001)。
- EBADE
- 无效的交换。
- EBADF
- 错误的文件描述符(POSIX.1-2001)。
- EBADFD
- 文件描述符处于错误状态。
- EBADMSG
- 错误消息(POSIX.1-2001)。
- EBADR
- 无效的请求描述符。
- EBADRQC
- 无效的请求代码。
- EBADSLT
- 插槽无效。
- EBUSY
- 设备或资源繁忙(POSIX.1-2001)。
- ECANCELED
- 操作被取消(POSIX.1-2001)。
- ECHILD
- 没有子进程(POSIX.1-2001)。
- ECHRNG
- 通道号超出范围。
- ECOMM
- 发送通讯错误。
- ECONNABORTED
- 连接异常终止(POSIX.1-2001)。
- ECONNREFUSED
- 连接被拒绝(POSIX.1-2001)。
- ECONNRESET
- 连接重置(POSIX.1-2001)。
- EDEADLK
- 避免资源死锁(POSIX.1-2001)。
- EDEADLOCK
- 在大多数体系结构上,EDEADLK的同义词。在某些架构(例如Linux MIPS,PowerPC,SPARC)上,它是单独的错误代码"文件锁定死锁错误"。
- EDESTADDRREQ
- 必需的目标地址(POSIX.1-2001)。
- EDOM
- 数学参数超出功能范围(POSIX.1,C99)。
- EDQUOT
- 超出磁盘配额(POSIX.1-2001)。
- EEXIST
- 文件存在(POSIX.1-2001)。
- EFAULT
- 地址错误(POSIX.1-2001)。
- EFBIG
- 文件太大(POSIX.1-2001)。
- EHOSTDOWN
- 主机已关闭。
- EHOSTUNREACH
- 主机无法访问(POSIX.1-2001)。
- EHWPOISON
- 内存页面出现硬件错误。
- EIDRM
- 标识符已删除(POSIX.1-2001)。
- EILSEQ
- 无效或不完整的多字节或宽字符(POSIX.1,C99)。
- 这里显示的文本是glibc错误说明;在POSIX.1中,此错误被描述为"非法字节序列"。
- EINPROGRESS
- 正在进行操作(POSIX.1-2001)。
- EINTR
- 中断的函数调用(POSIX.1-2001);参见signal(7)。
- EINVAL
- 无效的参数(POSIX.1-2001)。
- EIO
- 输入/输出错误(POSIX.1-2001)。
- EISCONN
- 套接字已连接(POSIX.1-2001)。
- EISDIR
- 是目录(POSIX.1-2001)。
- EISNAM
- 是一个命名类型文件。
- EKEYEXPIRED
- 密钥已过期。
- EKEYREJECTED
- 密钥已被服务拒绝。
- EKEYREVOKED
- 密钥已被撤消。
- EL2HLT
- 2级停止。
- EL2NSYNC
- 级别2未同步。
- EL3HLT
- 3级停止。
- EL3RST
- 3级重置。
- ELIBACC
- 无法访问所需的共享库。
- ELIBBAD
- 访问损坏的共享库。
- ELIBMAX
- 试图链接太多共享库。
- ELIBSCN
- .out中的.lib节已损坏
- ELIBEXEC
- 无法直接执行共享库。
- ELNRANGE
- 链接号超出范围。
- ELOOP
- 符号链接(POSIX.1-2001)的级别过多。
- EMEDIUMTYPE
- 错误的中型。
- EMFILE
- 打开的文件(POSIX.1-2001)太多。通常是由超出getrlimit(2)中描述的RLIMIT_NOFILE资源限制引起的。
- EMLINK
- 链接太多(POSIX.1-2001)。
- EMSGSIZE
- 消息太长(POSIX.1-2001)。
- EMULTIHOP
- 尝试进行多跳(POSIX.1-2001)。
- ENAMETOOLONG
- 文件名太长(POSIX.1-2001)。
- ENETDOWN
- 网络已关闭(POSIX.1-2001)。
- ENETRESET
- 网络中断了连接(POSIX.1-2001)。
- ENETUNREACH
- 网络无法访问(POSIX.1-2001)。
- ENFILE
- 系统(POSIX.1-2001)中打开的文件过多。在Linux上,这可能是遇到/ proc / sys / fs / file-max限制的结果(请参阅proc(5))。
- ENOANO
- 没有阳极。
- ENOBUFS
- 没有可用的缓冲区空间(POSIX.1(XSI STREAMS选件))。
- ENODATA
- STREAM头读取队列(POSIX.1-2001)上没有可用消息。
- ENODEV
- 没有这样的设备(POSIX.1-2001)。
- ENOENT
- 没有这样的文件或目录(POSIX.1-2001)。
- 通常,当指定的路径名不存在,或者路径名的目录前缀中的组件之一不存在,或者指定的路径名是悬空的符号链接时,将导致此错误。
- ENOEXEC
- 执行格式错误(POSIX.1-2001)。
- ENOKEY
- 所需的密钥不可用。
- ENOLCK
- 没有可用的锁(POSIX.1-2001)。
- ENOLINK
- 链接已切断(POSIX.1-2001)。
- ENOMEDIUM
- 找不到媒体。
- ENOMEM
- 空间不足/无法分配内存(POSIX.1-2001)。
- ENOMSG
- 没有所需类型的消息(POSIX.1-2001)。
- ENONET
- 机器不在网络上。
- ENOPKG
- 软件包未安装。
- ENOPROTOOPT
- 协议不可用(POSIX.1-2001)。
- ENOSPC
- 设备(POSIX.1-2001)上没有剩余空间。
- ENOSR
- 没有STREAM资源(POSIX.1(XSI STREAMS选项))。
- ENOSTR
- 不是STREAM(POSIX.1(XSI STREAMS选件))。
- ENOSYS
- 未实现功能(POSIX.1-2001)。
- ENOTBLK
- 需要阻止设备。
- ENOTCONN
- 插座未连接(POSIX.1-2001)。
- ENOTDIR
- 不是目录(POSIX.1-2001)。
- ENOTEMPTY
- 目录不为空(POSIX.1-2001)。
- ENOTRECOVERABLE
- 状态不可恢复(POSIX.1-2008)。
- ENOTSOCK
- 不是套接字(POSIX.1-2001)。
- ENOTSUP
- 不支持该操作(POSIX.1-2001)。
- ENOTTY
- I / O控制操作不当(POSIX.1-2001)。
- ENOTUNIQ
- 名称在网络上不唯一。
- ENXIO
- 没有这样的设备或地址(POSIX.1-2001)。
- EOPNOTSUPP
- 套接字(POSIX.1-2001)不支持该操作。
- (ENOTSUP和EOPNOTSUPP在Linux上具有相同的值,但是根据POSIX.1,这些错误值应该是不同的。)
- EOVERFLOW
- 值太大,无法存储为数据类型(POSIX.1-2001)。
- EOWNERDEAD
- 所有者去世(POSIX.1-2008)。
- EPERM
- 不允许操作(POSIX.1-2001)。
- EPFNOSUPPORT
- 不支持协议族。
- EPIPE
- 管道损坏(POSIX.1-2001)。
- EPROTO
- 协议错误(POSIX.1-2001)。
- EPROTONOSUPPORT
- 不支持协议(POSIX.1-2001)。
- EPROTOTYPE
- 套接字的协议错误类型(POSIX.1-2001)。
- ERANGE
- 结果太大(POSIX.1,C99)。
- EREMCHG
- 远程地址已更改。
- EREMOTE
- 对象是远程的。
- EREMOTEIO
- 远程I / O错误。
- ERESTART
- 中断的系统调用应重新启动。
- ERFKILL
- 由于射频干扰,无法进行操作。
- EROFS
- 只读文件系统(POSIX.1-2001)。
- ESHUTDOWN
- 传输终结点关闭后无法发送。
- ESPIPE
- 无效搜寻(POSIX.1-2001)。
- ESOCKTNOSUPPORT
- 不支持套接字类型。
- ESRCH
- 没有这样的过程(POSIX.1-2001)。
- ESTALE
- 过时的文件句柄(POSIX.1-2001)。
- 对于NFS和其他文件系统,可能会发生此错误。
- ESTRPIPE
- 流管道错误。
- ETIME
- 计时器到期(POSIX.1(XSI STREAMS选项)。
- (POSIX.1说" STREAM ioctl(2)超时"。)
- ETIMEDOUT
- 连接超时(POSIX.1-2001)。
- ETOOMANYREFS
- 参考文献过多:无法拼接。
- ETXTBSY
- 文本文件忙(POSIX.1-2001)。
- EUCLEAN
- 结构需要清洁。
- EUNATCH
- 未连接协议驱动程序。
- EUSERS
- 用户太多。
- EWOULDBLOCK
- 操作将阻塞(可能与EAGAIN的值相同)(POSIX.1-2001)。
- EXDEV
- 链接不正确(POSIX.1-2001)。
- EXFULL
- 交换已满。
备注
一个常见的错误是做
if (somecall() == -1) { printf("somecall() failed\n"); if (errno == ...) { ... } }
其中errno不再需要从somecall()返回时具有的值(即,可能已经由printf(3)更改了)。如果在整个库调用中保留errno的值,则必须保存它:
if (somecall() == -1) { int errsv = errno; printf("somecall() failed\n"); if (errsv == ...) { ... } }
在某些古老的系统上,不存在或未声明errno,因此有必要手动声明errno(即extern int errno)。不要这样做。很早以前就不再需要它了,它将导致现代版本的C库出现问题。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。