errno函数用法详解
errno函数简介
- 头文件包含
#include <errno.h>
- 函数定义
errno函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘errno’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <errno.h>
errno函数详细描述
对于某些系统调用和库函数(例如,getpriority (2))-1是成功时的有效返回)。在这种情况下,可以通过在调用之前将errno设置为零来区分成功返回和错误返回,然后,如果调用返回一个指示可能发生错误的状态,则检查errno是否具有非零值。
errno由ISO C标准定义为int 类型的可修改左值,不得显式声明;errno可能是宏。errno是线程本地的;在一个线程中设置它不会影响它在任何其他线程中的值。Error numbers and names有效的错误号都是正数。
POSIX.1指定的所有错误名称必须具有不同的值,但 EAGAIN 和EWOULDBLOCK 可能相同。在Linux上,这两者在所有架构上都具有相同的值。
对应于每个符号名称的错误号在UNIX系统中有所不同,甚至在Linux上的不同体系结构中也有所不同。因此,数值不包括在下面的错误名称列表中。perror (3)和strerror (3)函数可用于将这些名称转换为相应的文本错误消息。
在任何特定的Linux系统上,都可以使用errno (1)命令(moreutils包的一部分)获得所有符号错误名称和相应错误号的列表:
$ \fBerrno \-l\fP
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)命令还可用于查找单个错误号和名称,并使用错误说明中的字符串搜索错误,如下例所示:
$ \fBerrno 2\fP
ENOENT 2 No such file or directory
$ \fBerrno ESRCH\fP
ESRCH 3 No such process
$ \fBerrno \-s permission\fP
EACCES 13 Permission denied
List of error names在下面的符号错误名称列表中,各种名称标记如下:
- POSIX1-2001 :除非另有说明,否则该名称由POSIX.1-2001定义,并在更高版本的POSIX.1中定义。
- POSIX1-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)。.IP此处显示的文本是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 级复位。
- ELIBACC 无法访问所需的共享库。
- ELIBBAD 正在访问损坏的共享库。
- ELIBMAX 试图链接太多共享库。
- a.out中的 ELIBSCN &.lib节已损坏
- ELIBEXEC 不能直接执行共享库。
- ELNRANGE 链接号超出范围。
- ELOOP 符号链接级别太多(POSIX.1-2001)。
- EMEDIUMTYPE 错误的介质类型。
- EMFILE 打开的文件太多(POSIX.1-2001)。通常由超过getrlimit (2)中描述的RLIMIT_NOFILE资源限制引起的,也可能由超过/proc/sys/fs/nr_open 中指定的限制引起
- 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流选项))。
- ENODATA 流头读取队列(POSIX.1-2001)上没有可用的消息。
- ENODEV 没有这样的设备(POSIX.1-2001)。
- ENOENT 没有这样的文件或目录(POSIX.1-2001)。.IP通常,当指定的路径名不存在,或者路径名的目录前缀中的某个组件不存在,或者指定的路径名是悬空符号链接时,会导致此错误。
- 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 无流资源(POSIX.1(XSI流选项))。
- ENOSTR 不是流(POSIX.1(XSI流选项))。
- 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)。
- 套接字(POSIX.1-2001)不支持 EOPNOTSUPP 操作。.IP ( 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 中断的系统调用应重新启动。
- 由于RF-kill,无法进行 ERFKILL 操作。
- EROFS 只读文件系统(POSIX.1-2001)。
- ESHUTDOWN 无法在传输终结点关闭后发送。
- ESPIPE 无效寻道(POSIX.1-2001)。
- 不支持 ESOCKTNOSUPPORT 套接字类型。
- ESRCH 没有这样的过程(POSIX.1-2001)。
- ESTALE 过时文件句柄(POSIX.1-2001)。.IP对于NFS和其他文件系统,可能会出现此错误。
- ESTRPIPE 流管道错误。
- ETIME 计时器过期(POSIX.1(XSI流选项))。.IP(POSIX.1表示“流ioctl (2)超时”。)
- ETIMEDOUT 连接超时(POSIX.1-2001)。
- ETOOMANYREFS 引用太多:无法拼接。
- ETXTBSY 文本文件忙(POSIX.1-2001)。
- EUCLEAN 结构需要清理。
- 未附加 EUNATCH 协议驱动程序。
- EUSERS 用户太多。
- EWOULDBLOCK 操作将阻塞(可能与EAGAIN )(POSIX.1-2001)的值相同。
- EXDEV 不正确的链接(POSIX.1-2001)。
- EXFULL 交换已满。
errno函数其他说明
一个常见的错误是
if (somecall() == \-1) {
printf("somecall() failed\en");
if (errno == ...) { ... }
}
如果errno不再需要它从somecall ()返回时的值(即,它可能已经被printf (3))更改,如果errno的值应该在库调用中保留,则必须保存它:
if (somecall() == \-1) {
int errsv = errno;
printf("somecall() failed\en");
if (errsv == ...) { ... }
}
请注意,POSIX线程API会在出错时将not设置为errno。相反,在失败时,它们返回一个错误号作为函数结果。这些错误号与其他API在errno中返回的错误号具有相同的含义。
在一些古老的系统上,
评论区