侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

errno函数用法详解

noerror
2022-11-08 / 0 评论 / 0 点赞 / 41 阅读 / 2,812 字 / 正在检测是否收录...

errno函数用法详解

errno函数简介

  • 头文件包含
#include <errno.h>
  • 函数定义

errno函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘errno’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <errno.h>

errno函数详细描述

头文件定义了整数变量errno ,该变量由系统调用和一些库函数在出现错误时设置,以指示哪里出错了。errno errno中的值只有在调用的返回值指示错误时才有效(例如,大多数系统调用为-1;大多数库函数为-1或NULL);任何系统调用或库函数都不会将errno的值设置为零。
对于某些系统调用和库函数(例如,getpriority (2))-1是成功时的有效返回)。在这种情况下,可以通过在调用之前将errno设置为零来区分成功返回和错误返回,然后,如果调用返回一个指示可能发生错误的状态,则检查errno是否具有非零值。
errno由ISO C标准定义为int 类型的可修改左值,不得显式声明;errno可能是宏。errno是线程本地的;在一个线程中设置它不会影响它在任何其他线程中的值。Error numbers and names有效的错误号都是正数。头文件为errno 中可能出现的每个错误号定义符号名称
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中返回的错误号具有相同的含义。
在一些古老的系统上,不存在或没有声明errno ,因此需要手动声明errno(即"extern int errno" ) "Do not do this" 它很久以前就不再需要了,这将导致现代版本的C库出现问题。

0

评论区