errno的使用
名称
errno - 上次错误数值
简介
#include
描述
注意
一个常见的错误是
if (somecall() == -1) {
printf("somecall() failed\n");
if (errno == ...) { ... }
}
程序执行到if(errno == ...)的时候,此时的errno不再是somecall()函数执行错误赋给errno的值,因为程序经过printf()函数之后,尽管printf()函数执行成功,也会更改errno的值。
如果在库调用中应保留errno的值,则必须保存该值:
if (somecall() == -1) {
int errsv = errno;
printf("somecall() failed\n");
if (errsv == ...) { ... }
}
有效错误值均为非零;任何系统调用或库函数都不会将errno设置为零。
POSIX.1指定的所有错误名称都必须具有不同的值,但EAGAIN和EWOODBLOCK除外,它们可能是相同的。
下面是Linux上定义的符号错误名称的列表。其中一些标记为POSIX.1,表示名称是由POSIX.1-2001定义的,或者C99,表示名称是由C99定义的。
E2BIG 参数列表太长(POSIX.1)
EACCES 权限被拒绝(POSIX.1)
EADDRINUSE 地址已在使用中(POSIX.1)
EADDRNOTAVAIL 地址不可用(POSIX.1)
EAFNOSUPPORT 不支持地址族(POSIX.1)
EAGAIN 资源暂时不可用(可能与EWOULDBLOCK的值相同)(POSIX.1)
EALREADY 连接已在进行中(POSIX.1)
EBADE 无效的交换
EBADF 错误的文件描述符(POSIX.1)
EBADFD 文件描述符处于错误状态
EBADMSG 坏消息(POSIX.1)
EBADR 无效的请求描述符
EBADRQC 无效的请求代码
EBADSLT 无效插槽
EBUSY 设备或资源忙(POSIX.1)
ECANCELED 操作已取消(POSIX.1)
ECHILD 无子进程(POSIX.1)
ECHRNG 通道号超出范围
ECOMM 发送时通信错误
ECONNABORTED 连接失败(POSIX.1)
ECONNREFUSED 连接被拒绝(POSIX.1)
ECONNRESET 连接重置(POSIX.1)
EDEADLK 避免了资源死锁(POSIX.1)
EDEADLOCK EDEADLK的同义词
EDESTADDRREQ 需要目标地址(POSIX.1)
EDOM 函数域外的数学论证(POSIX.1,C99)
EDQUOT 超过磁盘配额(POSIX.1)
EEXIST 文件已存在(POSIX.1)
EFAULT 地址不正确(POSIX.1)
EFBIG 文件太大(POSIX.1)
EHOSTDOWN 主机坏了
EHOSTUNREACH 无法访问主机(POSIX.1)
EIDRM 标识符已删除(POSIX.1)
EILSEQ 非法字节序列(POSIX.1,C99)
EINPROGRESS 正在进行操作(POSIX.1)
EINTR 中断的函数调用(POSIX.1);参阅signal(7)。
EINVAL 无效参数(POSIX.1)
EIO 输入/输出错误(POSIX.1)
EISCONN Socket已连接(POSIX.1)
EISDIR 是一个目录(POSIX.1)
EISNAM 是命名类型文件
EKEYEXPIRED 密钥已过期
EKEYREJECTED 密钥被服务拒绝
EKEYREVOKED 密钥已被吊销
EL2HLT 2级暂停
EL2NSYNC 2级未同步
EL3HLT 3级暂停
EL3RST 3级暂停
ELIBACC 无法访问所需的共享库
ELIBBAD 访问损坏的共享库
ELIBMAX 试图链接过多的共享库
ELIBSCN a.out中的lib部分已损坏
ELIBEXEC 无法直接执行共享库
ELOOP 符号链接级别太多(POSIX.1)
EMEDIUMTYPE 介质类型错误
EMFILE 打开的文件太多(POSIX.1);通常由超过getrlimit(2)中描述的RLIMIT NOFILE资源限制引起
EMLINK 链接太多(POSIX.1)
EMSGSIZE 消息太长(POSIX.1)
EMULTIHOP 尝试多跳(POSIX.1)
ENAMETOOLONG 文件名太长(POSIX.1)
ENETDOWN 网络中断(POSIX.1)
ENETRESET 网络中断连接(POSIX.1)
ENETUNREACH 网络不能到达(POSIX.1)
ENFILE 系统中打开的文件太多;在Linux上,这可能是遇到/proc/sys/fs/file-max的结果(参阅proc(5))。
ENOBUFS 没有可用的缓冲区空间(POSIX.1(XSI STREAMS option))
ENODATA STREAM头读取队列上没有可用的消息(POSIX.1)
ENODEV 没有这样的设备(POSIX.1)
ENOENT 没有这样的文件或目录(POSIX.1)
ENOEXEC Exec格式错误(POSIX.1)
ENOKEY 所需密钥不可用
ENOLCK 没有可用的锁(POSIX.1)
ENOLINK 链接已断开(POSIX.1)
ENOMEDIUM 找不到介质
ENOMEM 空间不够(POSIX.1)
ENOMSG 没有所需类型的消息(POSIX.1)
ENONET 计算机不在网络上
ENOPKG 未安装程序包
ENOPROTOOPT 协议不可用(POSIX.1)
ENOSPC 设备上没有剩余空间(POSIX.1)
ENOSR 没有STREAM资源(POSIX.1(XSI STREAMS option))
ENOSTR 不是一个STREAM(POSIX.1(XSI STREAMS option))
ENOSYS 功能未实现(POSIX.1)
ENOTBLK 块设备需要
ENOTCONN socket未连接(POSIX.1)
ENOTDIR 不是目录(POSIX.1)
ENOTEMPTY 目录不为空(POSIX.1)
ENOTSOCK 不是一个socket(POSIX.1)
ENOTSUP 不支持的操作(POSIX.1)
ENOTTY I/O控制操作不当(POSIX.1)
ENOTUNIQ 名称在网络上不唯一
ENXIO 没有这样的设备或地址(POSIX.1)
EOPNOTSUPP socket 上不支持操作(POSIX.1)
(ENOTSUP和EOPNOTSUPP在Linux上具有相同的值,但是根据POSIX.1,这些错误值应该是不同的。)
EOVERFLOW 值太大,无法存储在数据类型中(POSIX.1)
EPERM 不允许操作(POSIX.1)
EPFNOSUPPORT 不支持协议系列
EPIPE 管道破裂(POSIX.1)
EPROTO 协议错误(POSIX.1)
EPROTONOSUPPORT 不支持协议(POSIX.1)
EPROTOTYPE socket的协议类型错误(POSIX.1)
ERANGE 结果太大(POSIX.1,C99)
EREMCHG 远程地址已更改
EREMOTE 对象是远程的
EREMOTEIO 远程I/O错误
ERESTART 中断的系统调用应重新启动
EROFS 只读文件系统(POSIX.1)
ESHUTDOWN 传输终结点关闭后无法发送
ESPIPE 无效的搜索(POSIX.1)
ESOCKTNOSUPPORT 不支持socket类型
ESRCH 没有这样的过程(POSIX.1)
ESTALE 过时文件句柄(POSIX.1)
NFS和其他文件系统可能会发生错误
ESTRPIPE streams管道错误
ETIME 计时器已过期(POSIX.1(XSI STREAMS option))
(POSIX.1 说“STREAM ioctl(2) 超时”)
ETIMEDOUT 连接超时(POSIX.1)
ETXTBSY 文本文件忙(POSIX.1)
EUCLEAN 结构需要清理
EUNATCH 未连接协议驱动程序
EUSERS 用户太多
EWOULDBLOCK 操作将阻止(可能与EAGAIN的值相同)(POSIX.1)
EXDEV 链接不正确(POSIX.1)
EXFULL 交换已满