最近在网络编程使用的过程中,发现errno会经常使用。因此决定在此做个留用,以备以后使用。。。
虽然errno是非线程安全的,但是可以通过几种机制保证其安全。。 最近在使用的过程中获得了errno,程序无法执行,也不知道如何解决问题。因此,理解每一个返回的errno整数值的含义是很重要的。。 这个我们可以通过strerror函数来实现。。 strerror(返回整数errno对应的错误原因的描述字符串) 所需头文件: #include<string.h> 函数声明: char * strerror(int errnum); 输入: 整数errno 输出: 返回描述错误原因的字符串指针 功能: 用来依参数errnum 的错误代码来查询其错误原因的描述字符串,然后将该字符串指针返回。 示例: #include <string.h> #include <stdio.h> #define NUM 150 int main(void) { int i; for ( i=0; i<NUM; i++ ) { printf( "%d:%s\n", i, strerror(i) ); } return 0; } 运行结果: 0:Success 1:Operation not permitted 2:No such file or directory 3:No such process 4:Interrupted system call 5:Input/output error 6:No such device or address 7:Argument list too long 8:Exec format error 9:Bad file descriptor 10:No child processes 11:Resource temporarily unavailable 12:Cannot allocate memory 13:Permission denied 14:Bad address 15:Block device required 16:Device or resource busy 17:File exists 18:Invalid cross-device link 19:No such device 20:Not a directory 21:Is a directory 22:Invalid argument 23:Too many open files in system 24:Too many open files 25:Inappropriate ioctl for device 26:Text file busy 27:File too large 28:No space left on device 29:Illegal seek 30:Read-only file system 31:Too many links 32:Broken pipe 33:Numerical argument out of domain 34:Numerical result out of range 35:Resource deadlock avoided 36:File name too long 37:No locks available 38:Function not implemented 39:Directory not empty 40:Too many levels of symbolic links 41:Unknown error 41 42:No message of desired type 43:Identifier removed 44:Channel number out of range 45:Level 2 not synchronized 46:Level 3 halted 47:Level 3 reset 48:Link number out of range 49:Protocol driver not attached 50:No CSI structure available 51:Level 2 halted 52:Invalid exchange 53:Invalid request descriptor 54:Exchange full 55:No anode 56:Invalid request code 57:Invalid slot 58:Unknown error 58 59:Bad font file format 60:Device not a stream 61:No data available 62:Timer expired 63:Out of streams resources 64:Machine is not on the network 65:Package not installed 66:Object is remote 67:Link has been severed 68:Advertise error 69:Srmount error 70:Communication error on send 71:Protocol error 72:Multihop attempted 73:RFS specific error 74:Bad message 75:Value too large for defined data type 76:Name not unique on network 77:File descriptor in bad state 78:Remote address changed 79:Can not access a needed shared library 80:Accessing a corrupted shared library 81:.lib section in a.out corrupted 82:Attempting to link in too many shared libraries 83:Cannot exec a shared library directly 84:Invalid or incomplete multibyte or wide character 85:Interrupted system call should be restarted 86:Streams pipe error 87:Too many users 88:Socket operation on non-socket 89:Destination address required 90:Message too long 91:Protocol wrong type for socket 92:Protocol not available 93:Protocol not supported 94:Socket type not supported 95:Operation not supported 96:Protocol family not supported 97:Address family not supported by protocol 98:Address already in use 99:Cannot assign requested address 100:Network is down 101:Network is unreachable 102:Network dropped connection on reset 103:Software caused connection abort 104:Connection reset by peer 105:No buffer space available 106:Transport endpoint is already connected 107:Transport endpoint is not connected 108:Cannot send after transport endpoint shutdown 109:Too many references: cannot splice 110:Connection timed out 111:Connection refused 112:Host is down 113:No route to host 114:Operation already in progress 115:Operation now in progress 116:Stale NFS file handle 117:Structure needs cleaning 118:Not a XENIX named type file 119:No XENIX semaphores available 120:Is a named type file 121:Remote I/O error 122:Disk quota exceeded 123:No medium found 124:Wrong medium type 125:Operation canceled 126:Required key not available 127:Key has expired 128:Key has been revoked 129:Key was rejected by service 130:Owner died 131:State not recoverable 132:Unknown error 132 133:Unknown error 133 134:Unknown error 134 135:Unknown error 135 136:Unknown error 136 137:Unknown error 137 138:Unknown error 138 139:Unknown error 139 140:Unknown error 140 141:Unknown error 141 142:Unknown error 142 143:Unknown error 143 144:Unknown error 144 145:Unknown error 145 146:Unknown error 146 147:Unknown error 147 148:Unknown error 148 149:Unknown error 149 通过这个我们终于理解errno的含义了。。那天做的一个使用非阻塞connect式爬虫,无论如何也不好使,也不知道怎么解决,程序并没有出现段错误,最终定位在write套接字时就退出,而通过FD_ISSET测试此套接字可写,于是不知道怎么解决了。通过捕捉errno值,发现是104.而如果当时我可以知道errno=104是指“Connection reset by peer”,那么我就知道了网络爬虫式客户端需要增加对于SIGPIPE信号的处理了。。因为SIGPIPE默认处理方式是退出,改成自己添加信号处理函数或者使用忽略就可以了。。。 所以列出这些信息,一方面能对大家有所帮助,另一方面方便以后查询。 1#ifndef _ASM_GENERIC_ERRNO_BASE_H 2#define _ASM_GENERIC_ERRNO_BASE_H 3 4#define EPERM 1 /* Operation not permitted */ 5#define ENOENT 2 /* No such file or directory */ 6#define ESRCH 3 /* No such process */ 7#define EINTR 4 /* Interrupted system call */ 8#define EIO 5 /* I/O error */ 9#define ENXIO 6 /* No such device or address */ 10#define E2BIG 7 /* Argument list too long */ 11#define ENOEXEC 8 /* Exec format error */ 12#define EBADF 9 /* Bad file number */ 13#define ECHILD 10 /* No child processes */ 14#define EAGAIN 11 /* Try again */ 15#define ENOMEM 12 /* Out of memory */ 16#define EACCES 13 /* Permission denied */ 17#define EFAULT 14 /* Bad address */ 18#define ENOTBLK 15 /* Block device required */ 19#define EBUSY 16 /* Device or resource busy */ 20#define EEXIST 17 /* File exists */ 21#define EXDEV 18 /* Cross-device link */ 22#define ENODEV 19 /* No such device */ 23#define ENOTDIR 20 /* Not a directory */ 24#define EISDIR 21 /* Is a directory */ 25#define EINVAL 22 /* Invalid argument */ 26#define ENFILE 23 /* File table overflow */ 27#define EMFILE 24 /* Too many open files */ 28#define ENOTTY 25 /* Not a typewriter */ 29#define ETXTBSY 26 /* Text file busy */ 30#define EFBIG 27 /* File too large */ 31#define ENOSPC 28 /* No space left on device */ 32#define ESPIPE 29 /* Illegal seek */ 33#define EROFS 30 /* Read-only file system */ 34#define EMLINK 31 /* Too many links */ 35#define EPIPE 32 /* Broken pipe */ 36#define EDOM 33 /* Math argument out of domain of func */ 37#define ERANGE 34 /* Math result not representable */ 38 39#endif
|