2010年(83)
分类: C/C++
2010-10-19 20:53:28
函数执行失败时,一般都会返回一个特定的值,比如-1、空指针。这些值只能说明有错误发生,但错误的原因并没有说明。头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以行到错误的描述信息。以下是errno.h文件的一部分:
|
程序开始执行时,变量errno被初始化为0.很多库函数在执行过程中遇到错误时就会将errno设置为相应的错误码。函数被成功调用时,它们不修改errno的值。因此,当一个函数被成功调用, errno的值可以不为零,它的非零值由前面的函数设置。所以不能根据errno的值来判断一个函数执行是否成功。当函数调用失败时,errno值才有意义。
以下是一个程序实例。
该实例通过打开一个文件,当由于某种原因该文件不能被打开时,就可以得到一个相应的errno值,检查其对应的错误码,可以得到错误的原因。
|
运行结果:
$ ./checkerrno
open file test failed, errno is 2
由errno的值可以查出2对应的错误码ENOENT, 得出出错原因是:文件或目录不存在。
查看错误代码errno是调试程序的一个重要方法。
现在把它贴出来,以后需要查时就方便了,嘿嘿!
#ifndef _SYS_ERRNO_H_
#define _SYS_ERRNO_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 /* Input/output error */
#define ENXIO 6 /*
Device not configured */
#define E2BIG 7 /* Argument list too long
*/
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /*
Bad file descriptor */
#define ECHILD 10 /* No child processes */
#define EDEADLK 11 /*
Resource deadlock avoided */
/* 11 was EAGAIN */
#define ENOMEM 12 /*
Cannot allocate memory */
#define EACCES 13 /* Permission denied
*/
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /*
Block device required */
#define EBUSY 16 /* Device busy */
#define EEXIST 17 /*
File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /*
Operation not supported by device */
#define ENOTDIR 20 /* Not a
directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /*
Invalid argument */
#define ENFILE 23 /* Too many open files in
system */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /*
Inappropriate ioctl for device */
#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 */
/* math software */
#define EDOM 33 /* Numerical argument out of
domain */
#define ERANGE 34 /* Result too large or too small */
/* non-blocking and interrupt i/o */
#define EAGAIN 35 /*
Resource temporarily unavailable */
#define EWOULDBLOCK EAGAIN /*
Operation would block */
#define EINPROGRESS 36 /* Operation now in
progress */
#define EALREADY 37 /* Operation already in progress */
/* ipc/network software -- argument errors */
#define ENOTSOCK 38 /*
Socket operation on non-socket */
#define EDESTADDRREQ 39 /*
Destination address required */
#define EMSGSIZE 40 /* Message too
long */
#define EPROTOTYPE 41 /* Protocol wrong type for socket */
#define ENOPROTOOPT 42 /*
Protocol not available */
#define EPROTONOSUPPORT 43 /* Protocol
not supported */
#define ESOCKTNOSUPPORT 44 /* Socket type not
supported */
#define EOPNOTSUPP 45 /* Operation not supported */
#define EPFNOSUPPORT 46 /*
Protocol family not supported */
#define EAFNOSUPPORT 47 /* Address
family not supported by protocol family */
#define EADDRINUSE 48 /*
Address already in use */
#define EADDRNOTAVAIL 49 /* Can't assign
requested address */
/* ipc/network software -- operational errors */
#define ENETDOWN 50 /*
Network is down */
#define ENETUNREACH 51 /* Network is unreachable
*/
#define ENETRESET 52 /* Network dropped connection on reset */
#define ECONNABORTED 53 /*
Software caused connection abort */
#define ECONNRESET 54 /*
Connection reset by peer */
#define ENOBUFS 55 /* No buffer space
available */
#define EISCONN 56 /* Socket is already connected */
#define ENOTCONN 57 /*
Socket is not connected */
#define ESHUTDOWN 58 /* Can't send after
socket shutdown */
#define ETOOMANYREFS 59 /* Too many references:
can't splice */
#define ETIMEDOUT 60 /* Operation timed out */
#define ECONNREFUSED 61 /*
Connection refused */
#define ELOOP 62 /* Too many levels of symbolic links */
#define ENAMETOOLONG 63 /*
File name too long */
/* should be rearranged */
#define EHOSTDOWN 64 /* Host is down
*/
#define EHOSTUNREACH 65 /* No route to host */
#define ENOTEMPTY 66 /*
Directory not empty */
/* quotas & mush */
#define EPROCLIM 67 /* Too many processes
*/
#define EUSERS 68 /* Too many users */
#define EDQUOT 69 /*
Disc quota exceeded */
/* Network File System */
#define ESTALE 70 /* Stale NFS file
handle */
#define EREMOTE 71 /* Too many levels of remote in path
*/
#define EBADRPC 72 /* RPC struct is bad */
#define ERPCMISMATCH 73 /*
RPC version wrong */
#define EPROGUNAVAIL 74 /* RPC prog. not avail
*/
#define EPROGMISMATCH 75 /* Program version wrong */
#define EPROCUNAVAIL 76 /*
Bad procedure for program */
#define ENOLCK 77 /* No locks available */
#define ENOSYS 78 /*
Function not implemented */
#define EFTYPE 79 /* Inappropriate file type or format */
#define EAUTH 80 /*
Authentication error */
#define ENEEDAUTH 81 /* Need authenticator
*/
/* SystemV IPC */
#define EIDRM 82 /* Identifier removed */
#define ENOMSG 83 /*
No message of desired type */
#define EOVERFLOW 84 /* Value too
large to be stored in data type */
/* Wide/multibyte-character handling, ISO/IEC 9899/AMD1:1995 */
#define EILSEQ 85 /*
Illegal byte sequence */
/* From IEEE Std 1003.1-2001 */
/* Base, Realtime, Threads or
Thread Priority Scheduling option errors */
#define ENOTSUP 86 /*
Not supported */
/* Realtime option errors */
#define ECANCELED 87 /* Operation
canceled */
/* Realtime, XSI STREAMS option errors */
#define EBADMSG 88 /*
Bad or Corrupt message */
/* XSI STREAMS option errors */
#define ENODATA 89 /* No
message available */
#define ENOSR 90 /* No STREAM resources */
#define
ENOSTR 91 /* Not a STREAM */
#define ETIME 92 /* STREAM ioctl
timeout */
#define ELAST 92 /* Must equal largest errno */
#ifdef _KERNEL
/* pseudo-errors returned inside kernel to modify
return to process */
#define EJUSTRETURN -2 /* don't modify regs,
just return */
#define ERESTART -3 /* restart syscall */
#define EPASSTHROUGH -4 /*
ioctl not handled by this layer */
#endif