linux OPEN函数返回值和错误解析

经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。
在程序代码中包含 #include <errno.h>,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量就可以获得失败原因了。
例如:
<code>
#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);
}
</code>
如果dsp设备忙的话errno值将是16。

errno.h中定义的错误代码值如下:

查 看错误代码errno是调试程序的一个重要方法。当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较 麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。
以下来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h
<code>
#ifndef _I386_ERRNO_H
#define _I386_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 /
I/O error /
#define ENXIO 6 /
No such device or address /
#define E2BIG 7 /
Arg list too long /
#define ENOEXEC 8 /
Exec format error /
#define EBADF 9 /
Bad file number /
#define ECHILD 10 /
No child processes /
#define EAGAIN 11 /
Try again /
#define ENOMEM 12 /
Out of memory /
#define EACCES 13 /
Permission denied /
#define EFAULT 14 /
Bad address /
#define ENOTBLK 15 /
Block device required /
#define EBUSY 16 /
Device or resource busy /
#define EEXIST 17 /
File exists /
#define EXDEV 18 /
Cross-device link /
#define ENODEV 19 /
No such device /
#define ENOTDIR 20 /
Not a directory /
#define EISDIR 21 /
Is a directory /
#define EINVAL 22 /
Invalid argument /
#define ENFILE 23 /
File table overflow /
#define EMFILE 24 /
Too many open files /
#define ENOTTY 25 /
Not a typewriter /
#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 /
#define EDOM 33 /
Math argument out of domain of func /
#define ERANGE 34 /
Math result not representable /
#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 */
#endif
</code>
同时也可以使用strerror()来自己翻译
如:
<code>
#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);
}
</code>
dsp设备忙的话将输出如下:
errno=16
Mesg:Device or resource busy

    原文作者:crystal_cry
    原文地址: https://www.jianshu.com/p/f3679eb83ca2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞