C 标准库 errno.h

让我们来详细讲解一下 C 标准库 errno.h 的使用攻略。

什么是 errno?

errno 是 C 标准库中的一个全局变量,其类型为 int,用于表达函数或操作的错误码(错误编号)。如果一个函数或操作执行出错,其返回值可能无法明显地反映错误的信息,此时可以通过 errno 变量获取更详细的错误信息。errno 的具体取值由库函数或系统调用设置。

系统调用是 Linux 操作系统中的一种机制,用户进程可以通过系统调用向操作系统内核(kernel)请求某些任务,如:文件操作、网络操作等。如果系统调用失败,则它们通常会将 errno 设置为一个非零值来指示失败类型。

errno.h 头文件

errno 变量及与其相关的宏定义都定义在 C 标准库头文件 errno.h 中。因此,在使用 errno 时需要包含该头文件。

#include <errno.h>

errno 的使用

使用 errno 变量获取错误码的基本步骤如下:

  1. 在使用可能出错的函数后判断其返回值是否有错误(通常为 -1,但也有例外),如果有,说明可能存在错误。
  2. 在需要获取错误码的位置检查 errno 变量的值,如果 errno 值为非零值,说明出现了错误。可以通过 perror()strerror() 函数将错误输出到标准错误输出(stderr)中,并清除 errno 的值,以便后续的调用不受影响。
  3. 根据需要进行错误处理。

下面分别介绍如何使用 perror()strerror() 函数进行错误处理。

perror()

perror() 函数可以将 errno 对应的错误信息输出到标准错误输出(stderr)中,同时可以自定义前缀信息。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void) {
    FILE *fp = fopen("notexist.txt", "r");
    if (fp == NULL) {
        perror("fopen() error");
    }
    return 0;
}

输出结果:

fopen() error: No such file or directory

strerror()

strerror() 函数可以将一个错误码转化为对应的错误信息。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(void) {
    FILE *fp = fopen("notexist.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "Error: %s\n", strerror(errno));
    }
    return 0;
}

输出结果:

Error: No such file or directory

示例说明

示例一:文件读取错误

在为文件打开或创建时,发生错误时都会涉及 errno 变量。下面以文件读取为例进行说明。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int get_file_size(const char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        fprintf(stderr, "Error: %s\n", strerror(errno));
        return -1;
    }

    fseek(fp, 0L, SEEK_END);
    int size = ftell(fp);
    fclose(fp);
    return size;
}

int main(void) {
    int size = get_file_size("notexist.txt");
    if (size == -1) {
        return 1;
    }
    printf("The size of file is: %d\n", size);
    return 0;
}

输出结果:

Error: No such file or directory

示例二:内存分配错误

在进行内存动态分配时,如果分配失败,会涉及 errno 变量。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define MAX_SIZE (1024 * 1024 * 1024)

int main(void) {
    int *ptr = malloc(MAX_SIZE);
    if (ptr == NULL) {
        fprintf(stderr, "Error: %s\n", strerror(errno));
        return 1;
    }
    free(ptr);
    return 0;
}

输出结果:

Error: Cannot allocate memory

以上就是 errno.h 的使用攻略,希望能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 标准库 errno.h - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C++中如何实现回调的方法示例

    C++中实现回调的方法有多种,下面介绍两种常见的实现方式。 方式一:函数指针 通过函数指针实现回调,需要定义一个函数指针类型,将回调函数与函数指针进行绑定,然后在合适的时机调用函数指针即可。 示例1 定义一个函数指针类型,函数原型为: typedef void (*MyCallbackFunc) (int arg1, int arg2); 其中,第一个参数表…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土

    一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平台 C语言是学习其他高级语言的基础,如C++、Java和Python 三、编程环境 1、在线编译 百度搜索C语言在线编译,会发现有很多在线编译工具 这里以菜鸟工…

    C语言 2023年4月18日
    00
  • OpenCV实现图像连通域

    下面是OpenCV实现图像连通域的完整攻略: 1. 简介 图像连通域是指一组具有相同像素值的像素的集合。在图像分割、形状识别等领域中,这是一个非常重要的概念。OpenCV提供了一些方法来计算图像中不同的连通域。在这篇文章中,我将向你展示如何用OpenCV实现图像连通域。 2. 实现步骤 OpenCV通过扫描整个图像,检测相邻像素值相同的像素,将这些像素标记为…

    C 2023年5月23日
    00
  • SpringBoot 整合Redis 数据库的方法

    以下是SpringBoot整合Redis的完整攻略: 环境准备 SpringBoot 2.x及以上 Redis 4.x及以上 Redis的Java客户端工具Jedis或Lettuce(本文以Jedis为例) SpringBoot 配置Redis 在SpringBoot的application.yml或application.properties文件中添加Re…

    C 2023年5月23日
    00
  • fork()和exec()的区别

    fork()和exec()的区别 在Linux系统中,fork()和exec()是两个常用的系统调用,它们都与进程有关。但是它们的用途是不同的,这里详细讲解两者的区别。 fork() fork()的作用是创建一个新的进程,新进程是原进程的副本,这个新进程被称为子进程。子进程具有与父进程(即原进程)完全相同的代码和数据,但是其运行状态和内存空间都是独立的,即父…

    C 2023年5月10日
    00
  • C 语言restrict 关键字的使用浅谈

    让我给您讲解一下“C语言restrict关键字的使用浅谈”的完整攻略。 什么是restrict关键字? restrict 是C99标准引入的一个关键字,用于向编译器提供限制指针的信息。它告诉编译器“该指针是唯一访问该内存区域的指针”,从而使编译器可以进行更好的优化。 restrict关键字的语法 要使用restrict关键字,需要将其放置在指针类型声明的左边…

    C 2023年5月23日
    00
  • C语言 strftime 格式化显示日期时间的实现

    C语言提供了strftime函数用于将日期时间按照指定格式转换为字符串,下面是使用步骤: 步骤一:头文件引入 #include <time.h> 步骤二:分配时间结构体 struct tm *tm; time_t timep; time(&timep); //获取秒数 tm = localtime(&timep); //转为日期时…

    C 2023年5月22日
    00
  • C++类与对象的重点知识点详细分析

    C++类与对象的重点知识点详细分析 什么是C++类和对象? 类是一种用户自定义的数据类型,它将数据的成员变量和行为的成员函数封装到一个单元中,用以描述现实世界中的对象,从而方便程序员编写复杂的业务逻辑。类的实例化对象称为对象,每个对象都有自己的数据和操作方法。C++中的类和对象是C语言的扩展,可以使用封装、继承和多态等特性实现OOP思想。 如何定义一个C++…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部