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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容