C语言中用于保存open函数执行错误代号的变量为errno(error number),每种打开错误都会返回一个错误代号,并且保存在error这个变量中。
如打开文件已存在,error的值为2。其指代的错误为EEXIST File exists (POSIX.1)
如果想要将errno数值,以其对应的错误解析输出的话,程序需要调用strerror(errno)这个函数。此函数会直接返回errno的错误信息。
将errno以及strerror两者公用之后的效果与perror相同。
用errno可以用于分析所有open失败的情况。
以下参考于http://blog.csdn.net/jediael_lu/article/details/8589194
0:Success
1:Operation not permitted
2:No such file or directory
3:No such process
4:Interrupted system call
5:Input/output error
6:No such device or address
7:Argument list too long
8:Exec format error
9:Bad file descriptor
10:No child processes
11:Resource temporarily unavailable
12:Cannot allocate memory
13:Permission denied
14:Bad address
15:Block device required
16:Device or resource busy
17:File exists
18:Invalid cross-device link
19:No such device
20:Not a directory
21:Is a directory
22:Invalid argument
23:Too many open files in system
24:Too many open files
25:Inappropriate ioctl for device
26:Text file busy
27:File too large
28:No space left on device
29:Illegal seek
30:Read-only file system
31:Too many links
32:Broken pipe
33:Numerical argument out of domain
34:Numerical result out of range
35:Resource deadlock avoided
36:File name too long
37:No locks available
38:Function not implemented
39:Directory not empty
40:Too many levels of symbolic links
41:Unknown error 41
42:No message of desired type
43:Identifier removed
44:Channel number out of range
45:Level 2 not synchronized
46:Level 3 halted
47:Level 3 reset
48:Link number out of range
49:Protocol driver not attached
50:No CSI structure available
51:Level 2 halted
52:Invalid exchange
53:Invalid request descriptor
54:Exchange full
55:No anode
56:Invalid request code
57:Invalid slot
58:Unknown error 58
59:Bad font file format
60:Device not a stream
61:No data available
62:Timer expired
63:Out of streams resources
64:Machine is not on the network
65:Package not installed
66:Object is remote
67:Link has been severed
68:Advertise error
69:Srmount error
70:Communication error on send
71:Protocol error
72:Multihop attempted
73:RFS specific error
74:Bad message
75:Value too large for defined data type
76:Name not unique on network
77:File descriptor in bad state
78:Remote address changed
79:Can not access a needed shared library
80:Accessing a corrupted shared library
81:.lib section in a.out corrupted
82:Attempting to link in too many shared libraries
83:Cannot exec a shared library directly
84:Invalid or incomplete multibyte or wide character
85:Interrupted system call should be restarted
86:Streams pipe error
87:Too many users
88:Socket operation on non-socket
89:Destination address required
90:Message too long
91:Protocol wrong type for socket
92:Protocol not available
93:Protocol not supported
94:Socket type not supported
95:Operation not supported
96:Protocol family not supported
97:Address family not supported by protocol
98:Address already in use
99:Cannot assign requested address
100:Network is down
101:Network is unreachable
102:Network dropped connection on reset
103:Software caused connection abort
104:Connection reset by peer
105:No buffer space available
106:Transport endpoint is already connected
107:Transport endpoint is not connected
108:Cannot send after transport endpoint shutdown
109:Too many references: cannot splice
110:Connection timed out
111:Connection refused
112:Host is down
113:No route to host
114:Operation already in progress
115:Operation now in progress
116:Stale NFS file handle
117:Structure needs cleaning
118:Not a XENIX named type file
119:No XENIX semaphores available
120:Is a named type file
121:Remote I/O error
122:Disk quota exceeded
123:No medium found
124:Wrong medium type
125:Operation canceled
126:Required key not available
printf("");
127:Key has expired
128:Key has been revoked
129:Key was rejected by service
130:Owner died
131:State not recoverable
132:Operation not possible due to RF-kill
133:Unknown error 133
134:Unknown error 134
135:Unknown error 135
136:Unknown error 136
137:Unknown error 137
138:Unknown error 138
139:Unknown error 139
==================================2017/2/24添加==================================
之前学会用errno这个方法之后,就经常把perror替换成printf("%s",strerror(errno));这样的形式,但是有时候要打很长代码的时候又发现很麻烦,又换了过来直接用perror输出,发现errno很累赘,貌似完全可以被perror函数替代。
前几天遇到个问题,我在arm开发板上搭建了一个boa服务器,需要用到cgi编程
在cgi编程的时候发现了一个问题,我的网站需要登陆才能访问,使用过cgi搭建boa网站的人应该知道所有的html标签都是c语言通过printf输出到浏览器,浏览器捕获到这些标记语言显示对应的内容,例如:
printf("<p>Hello, world!</p>",);
可以在网页中输出 "hello world!" 的字样。
但是我要看到我的代码运行到什么位置的时候,就必须要用页面访问的方式,才可以,因为我在页面中加入了html中post获取,如果直接在arm板上运行的话,获取不到post数据就会出现错误没办法正常运行(后来发现这也只是因为post操作之后,没有判断获取的数据如果为NULL的操作才会出现的错误)。
如果用perror输出的话,访问的时候也不会在页面中显示,因为perror是对标准输出文件的输出,但是浏览器并不是ARM开发板的标准输出,错误信息不会显示在浏览器中。
后来我想起了errno。原来errno是用在这种场合
printf('<script>alert("error information:%s")</script>',strerror(errno));
只要这样的话,所有的错误都可以借用script 的alert方法将错误信息以弹框的方式显示出来。如果遇到了用不了调试器,又没办法简单的perror的话,用errno这种方式将数据转换成%s字符串输出,会方便很多!
tips
errno 头文件 errno.h
strerror 头文件 string.h