文章目录
在C语言中我们经常需要调用库函数, 并通过函数的返回值判断调用是否成功. 有一个全局变量errno, 存放了函数调用过程中产生的错误码.
为防止和正常的返回值混淆,库函数的调用一般并不直接返回错误码, 而是将错误码存入一个名为errno的全局变量中. 如果调用失败,可以通过读取errno的值来确定问题所在,推测程序出错的原因, 这也是调试程序的方法.
配合strerror和perror两个库函数, 可以方便地查看出错的详细信息.
strerror 在<string.h>中声明, 用于获取错误码对应的消息描述
perror 在<stdio.h>中声明, 用于在屏幕上最近一次系统错误码及其消息描述, 在实际开发中,我们写的程序运行于后台, 在屏幕上显示错误信息没有意义.
strerror 函数
char *strerror(int errno);
函数说明: strerror() 用来返回参数errno的错误代码来查询其错误原因的描述字符串, 然后将该字符串的指针返回.
返回值: 返回描述错误原因的字符串指针.
打印出所有的错误信息
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int errorno;
for(errorno=0; errorno<150; errorno++){
printf("%d = %s\n", errorno, strerror(errorno));
}
return 0;
}
返回结果如下:
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 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
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 = Memory page has hardware error
134 = Unknown error 134
135 = Unknown error 135
136 = Unknown error 136
137 = Unknown error 137
138 = Unknown error 138
139 = Unknown error 139
140 = Unknown error 140
141 = Unknown error 141
142 = Unknown error 142
143 = Unknown error 143
144 = Unknown error 144
145 = Unknown error 145
146 = Unknown error 146
147 = Unknown error 147
148 = Unknown error 148
149 = Unknown error 149
- 调用库函数失败不一定会设置errno, 不属于系统调用的函数不会设置errno, ,
- errno不能作为调用库函数失败的标志, 实际开发中,判断函数是否成功执行, 可以判断返回值, 返回值失败的情况下, 才需要关注
errno
的值. - 程序员可以不用errno
版权声明:本文为weixin_39791387原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。