zoukankan      html  css  js  c++  java
  • Ubuntu下errno值

    Ubuntu下errno值

                每当一个Unix函数(如socket函数)中错误发生时,全局变量errno将被设置成一个指示错误类型的正整数,假设函数不返回错误,errno的值就未定义,值为0不表示不论什么错误.且具有以E开头的全大写字母名字。而且通常在/usr/include/sys/errno.h中定义,在Ubuntu中存放在/usr/include/asm-generic/errno.h,
           为了方便查找,我们先给出errno.h在Ubuntu里面的内容

    #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 */
    
    #endif
    


           在实际操作中,怎么在系统中实时查询errno.h的值呢?举一个用TCP协议获取server时间的样例。

    注意socket函数的第一參数已经由AF_INET改为9999.



    #include	"unp.h"
    
    int main(int argc, char **argv)
    {
    	int					sockfd, n;
    	char				recvline[MAXLINE + 1];
    	struct sockaddr_in	servaddr;
    
    	if (argc != 2)
    		err_quit("usage: a.out <IPaddress>");
    
    	if ( (sockfd = socket(9999, SOCK_STREAM, 0)) < 0)
    		err_sys("socket error");
    
    	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_port   = htons(13);	/* daytime server */
    	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    		err_quit("inet_pton error for %s", argv[1]);
    
    	if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
    		err_sys("connect error");
    
    	while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
    		recvline[n] = 0;	/* null terminate */
    		if (fputs(recvline, stdout) == EOF)
    			err_sys("fputs error");
    	}
    	if (n < 0)
    		err_sys("read error");
    
    	exit(0);
    }

    执行
    make daytimetcpcli
    ./daytimetcpcli 127.0.0.1
    






    要找出有关这个错误的具体信息,我们首先在errno.h头文件里使用grep查找字符串Address family not supported by protocol

    grep 'Address family not supported by protocol' /usr/include/asm-generic/errno.h
    

    #define	EAFNOSUPPORT	97	/* Address family not supported by protocol */

    这就是由socket返回的errno.h值,我们然后查看手冊页面.

    man socket

    大多数手冊在最以下的Errors标题给出额外的信息,只是一般都非常简洁



    意思就是不支持指定的地址家族,就是说AF_INET那个地方改成了9999,不支持这个地址家族。应该改成AF_INET或者AF_INET6等等.

  • 相关阅读:
    使用python三方库xlrd解析excel数据
    testng之listener
    使用Junit实现批量运行
    gojs绘流程图
    sqlserver
    Android学习笔记之 android:collapseColumns ,android:shrinkColumns 和stretchColumns
    myBatis oracle 与mysql自增问题
    Oracle总结
    Oracle 树操作(select…start with…connect by…prior)
    Oracle 获取当前日期及日期格式
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7125251.html
Copyright © 2011-2022 走看看