linux OPEN函數(shù)返回值和錯(cuò)誤解析

經(jīng)常在調(diào)用linux 系統(tǒng)api 的時(shí)候會(huì)出現(xiàn)一些錯(cuò)誤,比方說使用open() write() creat()之類的函數(shù)有些時(shí)候會(huì)返回-1,也就是調(diào)用失敗,這個(gè)時(shí)候往往需要知道失敗的原因。這個(gè)時(shí)候使用errno這個(gè)全局變量就相當(dāng)有用了。
在程序代碼中包含 #include <errno.h>,然后每次程序調(diào)用失敗的時(shí)候,系統(tǒng)會(huì)自動(dòng)用用錯(cuò)誤代碼填充errno這個(gè)全局變量,這樣你只需要讀errno這個(gè)全局變量就可以獲得失敗原因了。
例如:
<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設(shè)備忙的話errno值將是16。

errno.h中定義的錯(cuò)誤代碼值如下:

查 看錯(cuò)誤代碼errno是調(diào)試程序的一個(gè)重要方法。當(dāng)linuc C api函數(shù)發(fā)生異常時(shí),一般會(huì)將errno變量(需include errno.h)賦一個(gè)整數(shù)值,不同的值表示不同的含義,可以通過查看該值推測出錯(cuò)的原因。在實(shí)際編程中用這一招解決了不少原本看來莫名其妙的問題。比較 麻煩的是每次都要去linux源代碼里面查找錯(cuò)誤代碼的含義,現(xiàn)在把它貼出來,以后需要查時(shí)就來這里看了。
以下來自linux 2.4.20-18的內(nèi)核代碼中的/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>
同時(shí)也可以使用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設(shè)備忙的話將輸出如下:
errno=16
Mesg:Device or resource busy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容