errno的使用


名称
       errno - 上次错误数值

简介
       #include

描述
       头文件定义了整型变量errno;在系统调用和一些库函数在发生错误时,设置errno的值,用于提示出错的地方。它的值只有在函数调用出错时才有效;成功的函数可以更改errno的值。
注意
       一个常见的错误是

           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            交换已满

相关