errno详解

由于errno的重要性,在这里翻译一下Linux中man手册关于errno的内容以及errno涉及的要点

  • 注意点1
    就像errno的名字一样,它是最后一个错误的编号,因此要小心在查看错误之前又出现了新的错误。
  • 注意点2
    errno的值不会被任何程序清除,因此在使用errno的值之前,先要通过函数(系统调用/库函数)的返回值来确定有错误发生了。
  • 注意点3
    下面表格中没有一个常量是0。所以可以事先将errno的值设为0。
  • C标准引入在错误处理函数
 #include <string.h>
 char *strerror(int errnum);

这个函数将errno映射到错误消息字符串,并返回一个指向这个字符串的指针。

#include <stdio.h>
void perror(const char *msg);

perror有类似的功能,只是先加上了一个msg消息|

  • 名字
    errno - number of last error

  • 头文件

#include <errno.h>
  • 描述
    <errno.h>定义了整数变量errno。由系统调用和某些库函数根据事件来设置它,用以表明哪里有问题。这个值只有当调用的返回表明错误的时候有用,(比如,对于大多数的系统调用是-1,对于大多数的库函数来说是-1或NULL),正确的函数也可以修改errno。
    有效的错误number都是非零的; 系统调用和库函数不会把errno设为0。
    对于某些系统调用和库函数(比如,getpriority(2)),没有错误的时候也会返回-1。在这种情况下,可以在调用之前先将errno设为0,当不确定有没有错误的时候,可以通过查看errno是不是一个非零值来确定是否发生错误。
    ISO C标准将errno定义为一个可以修改的int型左值,并且不允许准确声明,errno可能是一个宏,errno是thread-local,在一个线程中设置它的值不会影响它在另一个thread中的值。
    所有由POSIX.1确定的错误名必须有唯一的值,有个例外是,EAGIAN和EWOULDBLOCK可能是相同的。
    下面是Linux定义的符号错误名,如果有POSIX.1标记,表明名字由POSIX.1-2001定义,由C99标记,表明名字由C99定义。
名字解释协议
E2BIG参数列表太长POSIX.1
EACCES拒绝访问(permision denied)POSIX.1
EADDRINUSE地址已经被使用POSIX.1
EADDRNOTAVAIL地址不可用POSIX.1
EAFNOSUPPORT地址族不支持POSIX.1
EAGIAN资源暂时不可用(可能和EWOULDBLOCK的值相同)POSIX.1
EALREADY已经连接POSIX.1
EBADE无效交换
EBADF坏的文件描述符POSIX.1
EBADFD文件描述符在坏的状态POSIX.1
EBADMSGBAD MESSAGEPOSIX.1
EBADR无效请求描述符
EBADRQC无效请求代码
EBADSLTInvalid Slot
EBUSY设备或资源忙POSIX.1
ECANCELED操作取消POSIX.1
ECHILD没有子进程POSIX.1
ECHRNGChannel number out of range
ECOMMCommunication error on send
ECONNABORTEDConnection abortedPOSIX.1
ECONNREFUSEDConnection refusedPOSIX.1
ECONNRESETConnection resetPOSIX.1
EDEADLKResource deadlock avoidedPOSIX.1
EDEADLOCKsynonym for EDEADLK
EDESTADDRREQDestination address requiredPOSIX.1
EDOMMathematics argument out domain of functionPOSIX.1 C99
EDQUOT超过磁盘配额POSIX.1
EEXIST文件存在POSIX.1
EFAULTBad addressPOSIX.1
EFBIG文件太大POSIX.1
EHOSTDOWN主机故障
EHOSTUNREACH主机不可达POSIX.1
EIDRMIdentifier removedPOSIX.1
EILSEQ非法字节序列POSIX.1,C99
EINPROGRESS正在操作POSIX.1
EINTR中断函数调用POSIX.1
EINVAL无效参数POSIX.1
EIO输入/输出错误POSIX.1
EISCONN套接字已经连接POSIX.1
EISDIR是一个目录POSIX.1
EISNAMIs a named type filePOSIX.1
EKEYEXPIREDKey过期了
EKEYREJECTEDKey被服务拒绝了
EKEYREVOKEDKey已经被取消
EL2HLTLevel 2停止
EL2NSYNSLevel 2不同步
EL3HLTLevel 3停止
EL3RSTLevel 3停止
ELIBACC不能访问所需的共享库
ELIBBAD访问了一个坏的共享库
ELIBMAX尝试链接过多的共享库
ELIBSCNa.out中的lib段毁坏了
ELIBEXEC不能直接运行一个共享库
ELOOP太多层的符号链接POSIX.1
EMEDIUMTYPE错误的中间类型
EMFILE太多打开的文件,往往是由于超过getrlimit(2)中描述的RLIMIT_NOFILE资源约束导致的POSIX.1
EMLINK太多的连接POSIX.1
EMSGSIZEmessage太长POSIX.1
EMULTIHOP尝试多跳POSIX.1
ENAMETOOLONG文件名太长POSIX.1
ENETDOWN网络不可用POSIX.1
ENETRESETConnection aborted by networkPOSIX.1
ENETUNREACH网络不可达POSIX.1
ENFILE系统中太多打开文件,在Linux可能是遇到了/proc/sys/fs/file-max约束POSIX.1
ENOBUFS没有可用的缓冲POSIX.1
ENODATANo message is avaliable on the STREAM head read queuePOSIX.1
ENODEV没有这个设备POSIX.1
ENOENTNo such file or directoryPOSIX.1
ENOEXEC执行格式错误POSIX.1
ENOKEYRequired key not availablePOSIX.1
ENOLCKNo locks avaliablePOSIX.1
ENOLINKLink has been servedPOSIX.1
ENOMEDIUMNo medium found
ENOMEMNot enough spacePOSIX.1
ENOMSGNo message of desired typePOSIX.1
ENONETMachine is not on the networkPOSIX.1
ENOPKGPackage not installedPOSIX.1
ENOPROTOOPTProtocol not avaliablePOSIX.1
ENOSPCNo space left on devicePOSIX.1
ENOSRNo STREAM resourcesPOSIX.1
ENOSTRNot a streamPOSIX.1
ENOSYSFunction Not implementatedPOSIX.1
ENOTBLKBlock device requiredPOSIX.1
ENOTCONNThe socket is not connectedPOSIX.1
ENOTDIR不是目录POSIX.1
ENOTEMPTYDirectory not emptyPOSIX.1
ENOTSOCKNot a socketPOSIX.1
ENOTSUPOperation not supportedPOSIX.1
ENOTTYInappropriate I/O control operationPOSIX.1
ENOUNIQ名字在网络上不唯一POSIX.1
ENXIONo such device or addressPOSIX.1
EOPNOTSUPPOperation not supported on socket(在Linux它和ENOTSUP有相同的值)POSIX.1
EOVERFLOWValue too large to be stored in data typePOSIX.1
EPERN操作不允许POSIX.1
EPFNOSUPPORTProtocol family not supported
EPIPEBroken pipePOSIX.1
EPROTOprotocol errorPOSIX.1
EPROTONOSUPPORT协议不支持POSIX.1
EPROTOTYPEProtocol wrong type for socketPOSIX.1
ERANGEResult too largePOSIX.1
EREMCHG远程地址改变POSIX.1
EREMOTEObject is remotePOSIX.1
EREMOTEIORemote I/O errorPOSIX.1
ERESTARTInterrupted system call should be restarted
EROFS只读文件系统POSIX.1
ESHUTDOWNCannot send after transport endpoint shutdown
ESPIPEInvalid seekPOSIX.1
ESOCKTNOSUPPORTSocket type not supportedPOSIX.1
ESRCHNo such processPOSIX.1
ESTALEStail file handlePOSIX.1
ESTRPIPEStreams pipe error
ETIME超时的POSIX.1
ETIMEDOUTConnection timed outPOSIX.1
ETXTBSYText file busyPOSIX.1
EUCLEANStructure needs cleaning
EUNATACHProtocol driver not attached
EUSERS太多的用户
EWOULDBLOCKOperation would block(may be same value as EAGAIN)POSIX.1
EXDEVImproper linkPOSIX.1
EXFULLExchange full
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值