Linux errno详解

1. 错误码 / errno

Linux中系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。

PS: 只有当系统调用或者调用lib函数时出错,才会置位errno

查看系统中所有的errno所代表的含义,可以采用如下的代码:

/* Function: obtain the errno string
* char *strerror(int errno)
*/

include <stdio.h>

include <string.h> //for strerror()

//#include <errno.h>
int main()
{
int tmp = 0;
for(tmp = 0; tmp <=256; tmp++)
{
printf("errno: %2d\t%s\n",tmp,strerror(tmp));
}
return 0;
}

输出信息如下:

errno: 0 Success
errno: 1 Operation not permitted
errno: 2 No such file or directory
errno: 3 No such process
errno: 4 Interrupted system call
errno: 5 Input/output error
errno: 6 No such device or address
errno: 7 Argument list too long
errno: 8 Exec format error
errno: 9 Bad file descriptor
errno: 10 No child processes
errno: 11 Resource temporarily unavailable
errno: 12 Cannot allocate memory
errno: 13 Permission denied
errno: 14 Bad address
errno: 15 Block device required
errno: 16 Device or resource busy
errno: 17 File exists
errno: 18 Invalid cross-device link
errno: 19 No such device
errno: 20 Not a directory
errno: 21 Is a directory
errno: 22 Invalid argument
errno: 23 Too many open files in system
errno: 24 Too many open files
errno: 25 Inappropriate ioctl for device
errno: 26 Text file busy
errno: 27 File too large
errno: 28 No space left on device
errno: 29 Illegal seek
errno: 30 Read-only file system
errno: 31 Too many links
errno: 32 Broken pipe
errno: 33 Numerical argument out of domain
errno: 34 Numerical result out of range
errno: 35 Resource deadlock avoided
errno: 36 File name too long
errno: 37 No locks available
errno: 38 Function not implemented
errno: 39 Directory not empty
errno: 40 Too many levels of symbolic links
errno: 41 Unknown error 41
errno: 42 No message of desired type
errno: 43 Identifier removed
errno: 44 Channel number out of range
errno: 45 Level 2 not synchronized
errno: 46 Level 3 halted
errno: 47 Level 3 reset
errno: 48 Link number out of range
errno: 49 Protocol driver not attached
errno: 50 No CSI structure available
errno: 51 Level 2 halted
errno: 52 Invalid exchange
errno: 53 Invalid request descriptor
errno: 54 Exchange full
errno: 55 No anode
errno: 56 Invalid request code
errno: 57 Invalid slot
errno: 58 Unknown error 58
errno: 59 Bad font file format
errno: 60 Device not a stream
errno: 61 No data available
errno: 62 Timer expired
errno: 63 Out of streams resources
errno: 64 Machine is not on the network
errno: 65 Package not installed
errno: 66 Object is remote
errno: 67 Link has been severed
errno: 68 Advertise error
errno: 69 Srmount error
errno: 70 Communication error on send
errno: 71 Protocol error
errno: 72 Multihop attempted
errno: 73 RFS specific error
errno: 74 Bad message
errno: 75 Value too large for defined data type
errno: 76 Name not unique on network
errno: 77 File descriptor in bad state
errno: 78 Remote address changed
errno: 79 Can not access a needed shared library
errno: 80 Accessing a corrupted shared library
errno: 81 .lib section in a.out corrupted
errno: 82 Attempting to link in too many shared libraries
errno: 83 Cannot exec a shared library directly
errno: 84 Invalid or incomplete multibyte or wide character
errno: 85 Interrupted system call should be restarted
errno: 86 Streams pipe error
errno: 87 Too many users
errno: 88 Socket operation on non-socket
errno: 89 Destination address required
errno: 90 Message too long
errno: 91 Protocol wrong type for socket
errno: 92 Protocol not available
errno: 93 Protocol not supported
errno: 94 Socket type not supported
errno: 95 Operation not supported
errno: 96 Protocol family not supported
errno: 97 Address family not supported by protocol
errno: 98 Address already in use
errno: 99 Cannot assign requested address
errno: 100 Network is down
errno: 101 Network is unreachable
errno: 102 Network dropped connection on reset
errno: 103 Software caused connection abort
errno: 104 Connection reset by peer
errno: 105 No buffer space available
errno: 106 Transport endpoint is already connected
errno: 107 Transport endpoint is not connected
errno: 108 Cannot send after transport endpoint shutdown
errno: 109 Too many references: cannot splice
errno: 110 Connection timed out
errno: 111 Connection refused
errno: 112 Host is down
errno: 113 No route to host
errno: 114 Operation already in progress
errno: 115 Operation now in progress
errno: 116 Stale file handle
errno: 117 Structure needs cleaning
errno: 118 Not a XENIX named type file
errno: 119 No XENIX semaphores available
errno: 120 Is a named type file
errno: 121 Remote I/O error
errno: 122 Disk quota exceeded
errno: 123 No medium found
errno: 124 Wrong medium type
errno: 125 Operation canceled
errno: 126 Required key not available
errno: 127 Key has expired
errno: 128 Key has been revoked
errno: 129 Key was rejected by service
errno: 130 Owner died
errno: 131 State not recoverable
errno: 132 Operation not possible due to RF-kill
errno: 133 Memory page has hardware error
errno: 134~255 unknown error!

Linux中,在头文件 /usr/include/asm-generic/errno-base.h 对基础常用errno进行了宏定义

ifndef _ASM_GENERIC_ERRNO_BASE_H

define _ASM_GENERIC_ERRNO_BASE_H

define EPERM 1 /* Operation not permitted */

define ENOENT 2 /* No such file or directory */

define ESRCH 3 /* No such process */

define EINTR 4 /* Interrupted system call */

define EIO 5 /* I/O error */

define ENXIO 6 /* No such device or address */

define E2BIG 7 /* Argument list too long */

define ENOEXEC 8 /* Exec format error */

define EBADF 9 /* Bad file number */

define ECHILD 10 /* No child processes */

define EAGAIN 11 /* Try again */

define ENOMEM 12 /* Out of memory */

define EACCES 13 /* Permission denied */

define EFAULT 14 /* Bad address */

define ENOTBLK 15 /* Block device required */

define EBUSY 16 /* Device or resource busy */

define EEXIST 17 /* File exists */

define EXDEV 18 /* Cross-device link */

define ENODEV 19 /* No such device */

define ENOTDIR 20 /* Not a directory */

define EISDIR 21 /* Is a directory */

define EINVAL 22 /* Invalid argument */

define ENFILE 23 /* File table overflow */

define EMFILE 24 /* Too many open files */

define ENOTTY 25 /* Not a typewriter */

define ETXTBSY 26 /* Text file busy */

define EFBIG 27 /* File too large */

define ENOSPC 28 /* No space left on device */

define ESPIPE 29 /* Illegal seek */

define EROFS 30 /* Read-only file system */

define EMLINK 31 /* Too many links */

define EPIPE 32 /* Broken pipe */

define EDOM 33 /* Math argument out of domain of func */

define ERANGE 34 /* Math result not representable */

endif

/usr/include/asm-asm-generic/errno.h 中,对剩余的errno做了宏定义

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 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

2. 打印错误信息

1). 打印错误信息 / perror

  • 作用
    打印系统错误信息

  • 头文件

    include <stdio.h>

  • 函数原型

    void perror(const char *s)

  • 参数

s: 字符串提示符

  • 输出形式
    const char *s: strerror(errno) //提示符:发生系统错误的原因
  • 返回值
    无返回值

2). 字符串显示错误信息 / strerror

  • 作用
    将错误码以字符串的信息显示出来

  • 头文件

    include <string.h>

  • 函数原型

    char *strerror(int errnum);

  • 参数

errnum: 即errno

  • 返回值
    返回错误码字符串信息
posted @ 2017-09-06 15:43  Jimmy_Nie  阅读(145717)  评论(0)    收藏  举报