C 标准库 errno.h

  • Post category:C

C标准库中的errno.h头文件定义了一组整型变量,称为errno 。这些变量用于指示函数调用期间是否发生了错误并指出错误的类型。在程序中使用errno变量可以方便地找到发生了什么错误,并且还可以根据错误类型采取适当的措施来处理错误。

errno变量

C标准库中定义了errno变量,它是程序错误代码的出口,errno变量在头文件中定义,类型是int。errno变量不应该被用户代码直接修改,其值由标准C库函数设置或清除。

下面是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的可能取值及其用法,利用这个库可以很好地发现程序中的错误并进行相应的处理。