经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。
在程序代码中包含 #include <errno.h>,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量就可以获得失败原因了。例如:#include <stdio.h>#include <string.h>#include <errno.h>int main(void){ int fd;extern int errno;if((fd = open("/dev/dsp",O_WRONLY)) < 0){ printf("errno=%d\n",errno);}exit(0);}如果dsp设备忙的话errno值将是16。errno.h中定义的错误代码值如下:查看错误代码errno是调试程序的一个重要方法。当linux C的API函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。以下来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h#ifndef _I386_ERRNO_H#define _I386_ERRNO_H#define EPERM 1#define ENOENT 2#define ESRCH 3#define EINTR 4#define EIO 5#define ENXIO 6#define E2BIG 7#define ENOEXEC 8#define EBADF 9#define ECHILD 10#define EAGAIN 11#define ENOMEM 12#define EACCES 13#define EFAULT 14#define ENOTBLK 15#define EBUSY 16#define EEXIST 17#define EXDEV 18#define ENODEV 19#define ENOTDIR 20#define EISDIR 21#define EINVAL 22#define ENFILE 23#define EMFILE 24#define ENOTTY 25#define ETXTBSY 26#define EFBIG 27#define ENOSPC 28#define ESPIPE 29#define EROFS 30#define EMLINK 31#define EPIPE 32#define EDOM 33#define ERANGE 34#define EDEADLK 35#define ENAMETOOLONG 36#define ENOLCK 37#define ENOSYS 38#define ENOTEMPTY 39#define ELOOP 40#define EWOULDBLOCK EAGAIN#define ENOMSG 42#define EIDRM 43#define ECHRNG 44#define EL2NSYNC 45#define EL3HLT 46#define EL3RST 47#define ELNRNG 48#define EUNATCH 49#define ENOCSI 50#define EL2HLT 51#define EBADE 52#define EBADR 53#define EXFULL 54#define ENOANO 55#define EBADRQC 56#define EBADSLT 57#define EDEADLOCK EDEADLK#define EBFONT 59#define ENOSTR 60#define ENODATA 61#define ETIME 62#define ENOSR 63#define ENONET 64#define ENOPKG 65#define EREMOTE 66#define ENOLINK 67#define EADV 68#define ESRMNT 69#define ECOMM 70#define EPROTO 71#define EMULTIHOP 72#define EDOTDOT 73#define EBADMSG 74#define EOVERFLOW 75#define ENOTUNIQ 76#define EBADFD 77#define EREMCHG 78#define ELIBACC 79#define ELIBBAD 80#define ELIBSCN 81#define ELIBMAX 82#define ELIBEXEC 83#define EILSEQ 84#define ERESTART 85#define ESTRPIPE 86#define EUSERS 87#define ENOTSOCK 88#define EDESTADDRREQ 89#define EMSGSIZE 90#define EPROTOTYPE 91#define ENOPROTOOPT 92#define EPROTONOSUPPORT 93#define ESOCKTNOSUPPORT 94#define EOPNOTSUPP 95#define EPFNOSUPPORT 96#define EAFNOSUPPORT 97#define EADDRINUSE 98#define EADDRNOTAVAIL 99#define ENETDOWN 100#define ENETUNREACH 101#define ENETRESET 102#define ECONNABORTED 103#define ECONNRESET 104#define ENOBUFS 105#define EISCONN 106#define ENOTCONN 107#define ESHUTDOWN 108#define ETOOMANYREFS 109#define ETIMEDOUT 110#define ECONNREFUSED 111#define EHOSTDOWN 112#define EHOSTUNREACH 113#define EALREADY 114#define EINPROGRESS 115#define ESTALE 116#define EUCLEAN 117#define ENOTNAM 118#define ENAVAIL 119#define EISNAM 120#define EREMOTEIO 121#define EDQUOT 122#define ENOMEDIUM 123#define EMEDIUMTYPE 124#endif同时也可以使用strerror()来自己翻译如:#include <stdio.h>#include <string.h>#include <errno.h>int main(void){ int fd;extern int errno;if((fd = open("/dev/dsp",O_WRONLY)) < 0){ printf("errno=%d\n",errno);char * mesg = strerror(errno);printf("Mesg:%s\n",mesg);}exit(0);}dsp设备忙的话将输出如下:errno=16Mesg:Device or resource busy