ERRNO - Linux手册页

时间:2019-08-20 18:00:12  来源:igfitidea点击:

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库出现问题。

另外参见

errno(1),err(3),error(3),perror(3),strerror(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/