1. 错误码 / errno
Linux中系统调用的错误都存储于 errno
中,errno
由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。
PS: 只有当系统调用或者调用lib函数时出错,才会置位
errno
!
查看系统中所有的errno
所代表的含义,可以采用如下的代码:
/* Function: obtain the errno string* char *strerror(int errno)*/#include#include //for strerror()//#include int main(){ int tmp = 0; for(tmp = 0; tmp <=256; tmp++) { printf("errno: %2d\t%s\n",tmp,strerror(tmp)); } return 0;}
输出信息如下:
errno: 0 Successerrno: 1 Operation not permittederrno: 2 No such file or directoryerrno: 3 No such processerrno: 4 Interrupted system callerrno: 5 Input/output errorerrno: 6 No such device or addresserrno: 7 Argument list too longerrno: 8 Exec format errorerrno: 9 Bad file descriptorerrno: 10 No child processeserrno: 11 Resource temporarily unavailableerrno: 12 Cannot allocate memoryerrno: 13 Permission deniederrno: 14 Bad addresserrno: 15 Block device requirederrno: 16 Device or resource busyerrno: 17 File existserrno: 18 Invalid cross-device linkerrno: 19 No such deviceerrno: 20 Not a directoryerrno: 21 Is a directoryerrno: 22 Invalid argumenterrno: 23 Too many open files in systemerrno: 24 Too many open fileserrno: 25 Inappropriate ioctl for deviceerrno: 26 Text file busyerrno: 27 File too largeerrno: 28 No space left on deviceerrno: 29 Illegal seekerrno: 30 Read-only file systemerrno: 31 Too many linkserrno: 32 Broken pipeerrno: 33 Numerical argument out of domainerrno: 34 Numerical result out of rangeerrno: 35 Resource deadlock avoidederrno: 36 File name too longerrno: 37 No locks availableerrno: 38 Function not implementederrno: 39 Directory not emptyerrno: 40 Too many levels of symbolic linkserrno: 41 Unknown error 41errno: 42 No message of desired typeerrno: 43 Identifier removederrno: 44 Channel number out of rangeerrno: 45 Level 2 not synchronizederrno: 46 Level 3 haltederrno: 47 Level 3 reseterrno: 48 Link number out of rangeerrno: 49 Protocol driver not attachederrno: 50 No CSI structure availableerrno: 51 Level 2 haltederrno: 52 Invalid exchangeerrno: 53 Invalid request descriptorerrno: 54 Exchange fullerrno: 55 No anodeerrno: 56 Invalid request codeerrno: 57 Invalid sloterrno: 58 Unknown error 58errno: 59 Bad font file formaterrno: 60 Device not a streamerrno: 61 No data availableerrno: 62 Timer expirederrno: 63 Out of streams resourceserrno: 64 Machine is not on the networkerrno: 65 Package not installederrno: 66 Object is remoteerrno: 67 Link has been severederrno: 68 Advertise errorerrno: 69 Srmount errorerrno: 70 Communication error on senderrno: 71 Protocol errorerrno: 72 Multihop attemptederrno: 73 RFS specific errorerrno: 74 Bad messageerrno: 75 Value too large for defined data typeerrno: 76 Name not unique on networkerrno: 77 File descriptor in bad stateerrno: 78 Remote address changederrno: 79 Can not access a needed shared libraryerrno: 80 Accessing a corrupted shared libraryerrno: 81 .lib section in a.out corruptederrno: 82 Attempting to link in too many shared librarieserrno: 83 Cannot exec a shared library directlyerrno: 84 Invalid or incomplete multibyte or wide charactererrno: 85 Interrupted system call should be restartederrno: 86 Streams pipe errorerrno: 87 Too many userserrno: 88 Socket operation on non-socketerrno: 89 Destination address requirederrno: 90 Message too longerrno: 91 Protocol wrong type for socketerrno: 92 Protocol not availableerrno: 93 Protocol not supportederrno: 94 Socket type not supportederrno: 95 Operation not supportederrno: 96 Protocol family not supportederrno: 97 Address family not supported by protocolerrno: 98 Address already in useerrno: 99 Cannot assign requested addresserrno: 100 Network is downerrno: 101 Network is unreachableerrno: 102 Network dropped connection on reseterrno: 103 Software caused connection aborterrno: 104 Connection reset by peererrno: 105 No buffer space availableerrno: 106 Transport endpoint is already connectederrno: 107 Transport endpoint is not connectederrno: 108 Cannot send after transport endpoint shutdownerrno: 109 Too many references: cannot spliceerrno: 110 Connection timed outerrno: 111 Connection refusederrno: 112 Host is downerrno: 113 No route to hosterrno: 114 Operation already in progresserrno: 115 Operation now in progresserrno: 116 Stale file handleerrno: 117 Structure needs cleaningerrno: 118 Not a XENIX named type fileerrno: 119 No XENIX semaphores availableerrno: 120 Is a named type fileerrno: 121 Remote I/O errorerrno: 122 Disk quota exceedederrno: 123 No medium founderrno: 124 Wrong medium typeerrno: 125 Operation cancelederrno: 126 Required key not availableerrno: 127 Key has expirederrno: 128 Key has been revokederrno: 129 Key was rejected by serviceerrno: 130 Owner diederrno: 131 State not recoverableerrno: 132 Operation not possible due to RF-killerrno: 133 Memory page has hardware errorerrno: 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#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函数原型:
void perror(const char *s)参数:
s: 字符串提示符
- 输出形式: const char *s: strerror(errno) //提示符:发生系统错误的原因
返回值:
无返回值
2). 字符串显示错误信息 / strerror
- 作用: 将错误码以字符串的信息显示出来
头文件:
#include函数原型:
char *strerror(int errnum);参数:
errnum: 即errno
- 返回值: 返回错误码字符串信息