初学C语言之 系统错误信息

文章目录

在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 版权协议,转载请附上原文出处链接和本声明。