• linux系统编程之错误处理


    在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中

     1 #ifndef    _ERRNO_H
     2 
     3 /* The includer defined __need_Emath if he wants only the definitions
     4    of EDOM and ERANGE, and not everything else.  */
     5 #ifndef    __need_Emath
     6 # define _ERRNO_H    1
     7 # include <features.h>
     8 #endif
     9 
    10 __BEGIN_DECLS
    11 
    12 /* Get the error number constants from the system-specific file.
    13    This file will test __need_Emath and _ERRNO_H.  */
    14 #include <bits/errno.h>
    15 #undef    __need_Emath
    16 
    17 #ifdef    _ERRNO_H
    18 
    19 /* Declare the `errno' variable, unless it's defined as a macro by
    20    bits/errno.h.  This is the case in GNU, where it is a per-thread
    21    variable.  This redeclaration using the macro still works, but it
    22    will be a function declaration without a prototype and may trigger
    23    a -Wstrict-prototypes warning.  */
    24 #ifndef    errno
    25 extern int errno;
    26 #endif
    27 
    28 #ifdef __USE_GNU
    29 
    30 /* The full and simple forms of the name with which the program was
    31    invoked.  These variables are set up automatically at startup based on
    32    the value of ARGV[0] (this works only if you use GNU ld).  */
    33 extern char *program_invocation_name, *program_invocation_short_name;
    34 #endif /* __USE_GNU */
    35 #endif /* _ERRNO_H */
    36 
    37 __END_DECLS
    38 
    39 #endif /* _ERRNO_H */
    40 
    41 /* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so
    42    that printing `error_t' values in the debugger shows the names.  We
    43    might need this definition sometimes even if this file was included
    44    before.  */
    45 #if defined __USE_GNU || defined __need_error_t
    46 # ifndef __error_t_defined
    47 typedef int error_t;
    48 #  define __error_t_defined    1
    49 # endif
    50 # undef __need_error_t
    51 #endif

    当系统调用出现无错误时,这个整型变量便会被设置成一个值,每个值有一个特殊的含义,每一值用一个宏来表示,/usr/include/asm-generic/errno.h文件中定义

    #ifndef _ASM_GENERIC_ERRNO_H
    #define _ASM_GENERIC_ERRNO_H
    
    #include <asm-generic/errno-base.h>
    
    #define    EDEADLK        35    /* Resource deadlock would occur */
    #define    ENAMETOOLONG    36    /* File name too long */
    #define    ENOLCK        37    /* No record locks available */
    #define    ENOSYS        38    /* Function not implemented */
    #define    ENOTEMPTY    39    /* Directory not empty */
    #define    ELOOP        40    /* Too many symbolic links encountered */
    #define    EWOULDBLOCK    EAGAIN    /* Operation would block */
    #define    ENOMSG        42    /* No message of desired type */
    #define    EIDRM        43    /* Identifier removed */
    #define    ECHRNG        44    /* Channel number out of range */
    #define    EL2NSYNC    45    /* Level 2 not synchronized */
    #define    EL3HLT        46    /* Level 3 halted */
    #define    EL3RST        47    /* Level 3 reset */
    #define    ELNRNG        48    /* Link number out of range */
    #define    EUNATCH        49    /* Protocol driver not attached */
    #define    ENOCSI        50    /* No CSI structure available */
    #define    EL2HLT        51    /* Level 2 halted */
    #define    EBADE        52    /* Invalid exchange */
    #define    EBADR        53    /* Invalid request descriptor */
    #define    EXFULL        54    /* Exchange full */
    #define    ENOANO        55    /* No anode */
    #define    EBADRQC        56    /* Invalid request code */
    #define    EBADSLT        57    /* Invalid slot */
    
    #define    EDEADLOCK    EDEADLK
    
    #define    EBFONT        59    /* Bad font file format */
    #define    ENOSTR        60    /* Device not a stream */
    #define    ENODATA        61    /* No data available */
    #define    ETIME        62    /* Timer expired */
    #define    ENOSR        63    /* Out of streams resources */
    #define    ENONET        64    /* Machine is not on the network */
    #define    ENOPKG        65    /* Package not installed */
    #define    EREMOTE        66    /* Object is remote */
    #define    ENOLINK        67    /* Link has been severed */
    #define    EADV        68    /* Advertise error */
    #define    ESRMNT        69    /* Srmount error */
    #define    ECOMM        70    /* Communication error on send */
    #define    EPROTO        71    /* Protocol error */
    #define    EMULTIHOP    72    /* Multihop attempted */
    #define    EDOTDOT        73    /* RFS specific error */
    #define    EBADMSG        74    /* Not a data message */
    #define    EOVERFLOW    75    /* Value too large for defined data type */
    #define    ENOTUNIQ    76    /* Name not unique on network */
    #define    EBADFD        77    /* File descriptor in bad state */
    #define    EREMCHG        78    /* Remote address changed */
    #define    ELIBACC        79    /* Can not access a needed shared library */
    #define    ELIBBAD        80    /* Accessing a corrupted shared library */
    #define    ELIBSCN        81    /* .lib section in a.out corrupted */
    #define    ELIBMAX        82    /* Attempting to link in too many shared libraries */
    #define    ELIBEXEC    83    /* Cannot exec a shared library directly */
    #define    EILSEQ        84    /* Illegal byte sequence */
    #define    ERESTART    85    /* Interrupted system call should be restarted */
    #define    ESTRPIPE    86    /* Streams pipe error */
    #define    EUSERS        87    /* Too many users */
    #define    ENOTSOCK    88    /* Socket operation on non-socket */
    #define    EDESTADDRREQ    89    /* Destination address required */
    #define    EMSGSIZE    90    /* Message too long */
    #define    EPROTOTYPE    91    /* Protocol wrong type for socket */
    #define    ENOPROTOOPT    92    /* Protocol not available */
    #define    EPROTONOSUPPORT    93    /* Protocol not supported */
    #define    ESOCKTNOSUPPORT    94    /* Socket type not supported */
    #define    EOPNOTSUPP    95    /* Operation not supported on transport endpoint */
    #define    EPFNOSUPPORT    96    /* Protocol family not supported */
    #define    EAFNOSUPPORT    97    /* Address family not supported by protocol */
    #define    EADDRINUSE    98    /* Address already in use */
    #define    EADDRNOTAVAIL    99    /* Cannot assign requested address */
    #define    ENETDOWN    100    /* Network is down */
    #define    ENETUNREACH    101    /* Network is unreachable */
    #define    ENETRESET    102    /* Network dropped connection because of reset */
    #define    ECONNABORTED    103    /* Software caused connection abort */
    #define    ECONNRESET    104    /* Connection reset by peer */
    #define    ENOBUFS        105    /* No buffer space available */
    #define    EISCONN        106    /* Transport endpoint is already connected */
    #define    ENOTCONN    107    /* Transport endpoint is not connected */
    #define    ESHUTDOWN    108    /* Cannot send after transport endpoint shutdown */
    #define    ETOOMANYREFS    109    /* Too many references: cannot splice */
    #define    ETIMEDOUT    110    /* Connection timed out */
    #define    ECONNREFUSED    111    /* Connection refused */
    #define    EHOSTDOWN    112    /* Host is down */
    #define    EHOSTUNREACH    113    /* No route to host */
    #define    EALREADY    114    /* Operation already in progress */
    #define    EINPROGRESS    115    /* Operation now in progress */
    #define    ESTALE        116    /* Stale NFS file handle */
    #define    EUCLEAN        117    /* Structure needs cleaning */
    #define    ENOTNAM        118    /* Not a XENIX named type file */
    #define    ENAVAIL        119    /* No XENIX semaphores available */
    #define    EISNAM        120    /* Is a named type file */
    #define    EREMOTEIO    121    /* Remote I/O error */
    #define    EDQUOT        122    /* Quota exceeded */
    
    #define    ENOMEDIUM    123    /* No medium found */
    #define    EMEDIUMTYPE    124    /* Wrong medium type */
    #define    ECANCELED    125    /* Operation Canceled */
    #define    ENOKEY        126    /* Required key not available */
    #define    EKEYEXPIRED    127    /* Key has expired */
    #define    EKEYREVOKED    128    /* Key has been revoked */
    #define    EKEYREJECTED    129    /* Key was rejected by service */
    
    /* for robust mutexes */
    #define    EOWNERDEAD    130    /* Owner died */
    #define    ENOTRECOVERABLE    131    /* State not recoverable */
    
    #define ERFKILL        132    /* Operation not possible due to RF-kill */
    
    #define EHWPOISON    133    /* Memory page has hardware error */
    
    #endif

    解释完了errno的含义,那么我们来用两个常用的错误输出函数

    一个是perror

    void perror(const char *s);//根据系统设置好的errno的值来输出错误信息
                              //错误信息会包含程序员自己填写的内容,以参数s传入程序员想要输出的内容

    一个是strerror

    char *strerror(int errnum);//把errno传入到函数strerror中,strerror返回相应错误信息的文本
  • 相关阅读:
    GridView中checkbox实现全选[转]
    go 格式化秒 running
    mysql 聚簇索引和非聚簇索引 running
    go context上下文取消 running
    go reflect running
    time.ticker running
    go 数据结构与算法之二分查找 running
    mysql 联合索引最左前缀匹配原则 running
    es 修改 mapping 字段类型 running
    linux 查看虚拟机网卡命令 running
  • 原文地址:https://www.cnblogs.com/cplinux/p/6032587.html
Copyright © 2020-2023  润新知