C标准库中的errno.h头文件定义了一组整型变量,称为errno 。这些变量用于指示函数调用期间是否发生了错误并指出错误的类型。在程序中使用errno变量可以方便地找到发生了什么错误,并且还可以根据错误类型采取适当的措施来处理错误。
errno变量
C标准库中定义了errno变量,它是程序错误代码的出口,errno变量在头文件
下面是errno变量的一些常见值:
errno值 | 错误类型 |
---|---|
EPERM | 没有权限 |
ENOENT | 文件不存在 |
ESRCH | 进程不存在 |
EINTR | 被中断 |
EIO | I/O 错误 |
ENXIO | 设备不存在 |
E2BIG | 参数太长 |
ENOEXEC | 执行格式出错 |
EBADF | 坏的文件描述符 |
ECHILD | 子进程不存在 |
EAGAIN | 暂时无法处理请求 |
ENOMEM | 没有足够空间 |
错误处理
如果有一个函数调用未能成功完成它的任务,它可能会设置errno变量来指示错误的本质。通常情况下,errno的值应该被设置为0(表示成功)之前,检查errno变量以确定函数调用是否成功非常重要。
下面是一些通用的方法来使用errno:
#include <errno.h>
int main(void) {
FILE *f;
f = fopen("nonexistent.file", "r");
if (f == NULL) {
fprintf(stderr, "Error opening file %s: %s\n",
"nonexistent.file", strerror(errno));
}
return errno;
}
两个示例
示例1:1/0情况的错误处理
下面的示例将尝试将1除以0,这是一个不可能的操作,将设置errno变量,并用perror()函数检测并打印错误消息。
#include <stdio.h>
#include <errno.h>
int main() {
int a = 1, b = 0;
int result;
if (b == 0) {
// do not execute since divisor cannot be 0
errno = ERANGE; // error code
perror("cannot divide"); // error message
return errno; // exit the program with `errno` status
} else {
result = a / b;
printf("The result of the division is %d\n", result);
}
return 0;
}
输出:
cannot divide: Numerical argument out of domain
示例2:检查fopen()函数失败的情况
下面的示例将尝试打开一个不存在的文件(由fopen()函数尝试),并检查fopen()函数是否失败,如果失败将设置errno变量并使用strerror()函数获得错误消息。
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *f;
f = fopen("nonexistent.file", "r");
if (f == NULL) {
fprintf(stderr, "Error opening file %s: %s\n",
"nonexistent.file", strerror(errno));
}
return errno;
}
输出:
Error opening file nonexistent.file: No such file or directory
这说明了errno的可能取值及其用法,利用这个库可以很好地发现程序中的错误并进行相应的处理。