Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34248
  • 博文数量: 10
  • 博客积分: 270
  • 博客等级: 二等列兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-05 21:42
文章分类

全部博文(10)

文章存档

2012年(10)

我的朋友

分类: C/C++

2012-01-16 08:44:19

当linux中的C api函数发生异常时,一般会将errno变量(需include
errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题。但是errno是一个数字,代表的具体含义还要到errno.h中去阅读宏定义,而每次查阅是一件很繁琐的事情。有下面几种方法可以方便的得到错误信息
(1)void perror(const char *s)
函数说明
perror ( )用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s
所指的字符串会先打印出,后面再加上错误原因 字符串。此错误原因依照全局变量
errno 的值来决定要输出的字符串。
(2) char *strerror(int errno)
将错误代码转换为字符串错误信息,可以将该字符串和其它的信息组合输出到用户界面例如
fprintf(stderr,"error in CreateProcess %s, Process ID %d
",strerror(errno),processID)
注:假设processID是一个已经获取了的整形ID
(3)printf("%m", errno);
另外不是所有的地方发生错误的时候都可以通过error获取错误代码,例如下面的代码段
#include"stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "netdb.h"
#include "sys/types.h"
#include "netinet/in.h"
int main (int argc, char *argv[])
{
struct hostent *h;
if (argc != 2)
{
fprintf (stderr ,"usage: getip address\n");
exit(1);
}
if((h=gethostbyname(argv[1])) == NULL)
{
herror("gethostbyname");
exit(1);
}
printf("Host name : %s\n", h->h_name);
printf("IP Address : %s\n", inet_ntoa (*((struct in_addr *)h->h_addr)));
return 0;
}

通过上面的代码可以看到:使用gethostbyname()函数,你不能使用perror()来输出错误信息(因为错误代码存储在
h_errno 中而不是errno 中。所以,你需要调用herror()函数。
你简单的传给gethostbyname()
一个机器名("bbs.tsinghua.edu.cn"),然后就从返回的结构struct hostent
中得到了IP 等其他信息.程序中输出IP 地址的程序需要解释一下:h->h_addr
是一个char*,但是inet_ntoa()函数需要传递的是一个struct in_addr
结构。所以上面将h->h_addr 强制转换为struct
in_addr*,然后通过它得到了所有数据。
linux 的errno定义,头文件#include 
  124 EMEDIUMTYPE   Wrong medium type
  123 ENOMEDIUM     No medium found
  122 EDQUOT        Disk quota exceeded
  121 EREMOTEIO     Remote I/O error
  120 EISNAM        Is a named type file
  119 ENAVAIL       No XENIX semaphores available
  118 ENOTNAM       Not a XENIX named type file
  117 EUCLEAN       Structure needs cleaning
  116 ESTALE        Stale NFS file handle
  115 EINPROGRESS  +Operation now in progress
  114 EALREADY      Operation already in progress
  113 EHOSTUNREACH  No route to host
  112 EHOSTDOWN     Host is down
  111 ECONNREFUSED  Connection refused
  110 ETIMEDOUT    +Connection timed out
  109 ETOOMANYREFS  Too many references: cannot splice
  108 ESHUTDOWN     Cannot send after transport endpoint shutdown
  107 ENOTCONN      Transport endpoint is not connected
  106 EISCONN       Transport endpoint is already connected
  105 ENOBUFS       No buffer space available
  104 ECONNRESET    Connection reset by peer
  103 ECONNABORTED  Software caused connection abort
  102 ENETRESET     Network dropped connection on reset
  101 ENETUNREACH   Network is unreachable
  100 ENETDOWN      Network is down
  99 EADDRNOTAVAIL Cannot assign requested address
  98 EADDRINUSE    Address already in use
  97 EAFNOSUPPORT  Address family not supported by protocol
  96 EPFNOSUPPORT  Protocol family not supported
  95 EOPNOTSUPP    Operation not supported
  94 ESOCKTNOSUPPORT Socket type not supported
  93 EPROTONOSUPPORT Protocol not supported
  92 ENOPROTOOPT   Protocol not available
  91 EPROTOTYPE    Protocol wrong type for socket
  90 EMSGSIZE     +Message too long
  89 EDESTADDRREQ  Destination address required
  88 ENOTSOCK      Socket operation on non-socket
  87 EUSERS        Too many users
  86 ESTRPIPE      Streams pipe error
  85 ERESTART      Interrupted system call should be restarted
  84 EILSEQ        Invalid or incomplete multibyte or wide character
  83 ELIBEXEC      Cannot exec a shared library directly
  82 ELIBMAX       Attempting to link in too many shared libraries
  81 ELIBSCN       .lib section in a.out corrupted
  80 ELIBBAD       Accessing a corrupted shared library
  79 ELIBACC       Can not access a needed shared library
  78 EREMCHG       Remote address changed
  77 EBADFD        File descriptor in bad state
  76 ENOTUNIQ      Name not unique on network
  75 EOVERFLOW     Value too large for defined data type
  74 EBADMSG      +Bad message
  73 EDOTDOT       RFS specific error
  72 EMULTIHOP     Multihop attempted
  71 EPROTO        Protocol error
  70 ECOMM         Communication error on send
  69 ESRMNT        Srmount error
  68 EADV          Advertise error
  67 ENOLINK       Link has been severed
  66 EREMOTE       Object is remote
  65 ENOPKG        Package not installed
  64 ENONET        Machine is not on the network
  63 ENOSR         Out of streams resources
  62 ETIME         Timer expired
  61 ENODATA       No data available
  60 ENOSTR        Device not a stream
  59 EBFONT        Bad font file format
  57 EBADSLT       Invalid slot
  56 EBADRQC       Invalid request code
  55 ENOANO        No anode
  54 EXFULL        Exchange full
  53 EBADR         Invalid request descriptor
  52 EBADE         Invalid exchange
  51 EL2HLT        Level 2 halted
  50 ENOCSI        No CSI structure available
  49 EUNATCH       Protocol driver not attached
  48 ELNRNG        Link number out of range
  47 EL3RST        Level 3 reset
  46 EL3HLT        Level 3 halted
  45 EL2NSYNC      Level 2 not synchronized
  44 ECHRNG        Channel number out of range
  43 EIDRM         Identifier removed
  42 ENOMSG        No message of desired type
  40 ELOOP         Too many levels of symbolic links
  39 ENOTEMPTY    +Directory not empty
  38 ENOSYS       +Function not implemented
  37 ENOLCK       +No locks available
  36 ENAMETOOLONG +File name too long
  35 EDEADLK      +Resource deadlock avoided
  34 ERANGE       +Numerical result out of range
  33 EDOM         +Numerical argument out of domain
  32 EPIPE        +Broken pipe
  31 EMLINK       +Too many links
  30 EROFS        +Read-only file system
  29 ESPIPE       +Illegal seek
  28 ENOSPC       +No space left on device
  27 EFBIG        +File too large
  26 ETXTBSY       Text file busy
  25 ENOTTY       +Inappropriate ioctl for device
  24 EMFILE       +Too many open files
  23 ENFILE       +Too many open files in system
  22 EINVAL       +Invalid argument
  21 EISDIR       +Is a directory
  20 ENOTDIR      +Not a directory
  19 ENODEV       +No such device
  18 EXDEV        +Invalid cross-device link
  17 EEXIST       +File exists
  16 EBUSY        +Device or resource busy
  15 ENOTBLK       Block device required
  14 EFAULT       +Bad address
  13 EACCES       +Permission denied
  12 ENOMEM       +Cannot allocate memory
  11 EAGAIN       +Resource temporarily unavailable
  10 ECHILD       +No child processes
  9 EBADF        +Bad file descriptor
  8 ENOEXEC      +Exec format error
  7 E2BIG        +Argument list too long
  6 ENXIO        +No such device or address
  5 EIO          +Input/output error
  4 EINTR        +Interrupted system call
  3 ESRCH        +No such process
  2 ENOENT       +No such file or directory
  1 EPERM        +Operation not permitted
  0                    Success
 
阅读(1638) | 评论(0) | 转发(0) |
0

上一篇:system

下一篇:fork() vfork()

给主人留下些什么吧!~~