当前位置: 首页 > news >正文

C语言中errno错误码定义及使用

一.概述

 1.介绍

    在 C 语言中,errno是一个用于标识程序运行时错误的全局变量。当系统调用或库函数执行失败时,通常会设置errno以指示具体的错误类型。

 

2.errno的基本定义

头文件:#include <errno.h>

类型:int

用途:存储最近一次系统调用或库函数失败的错误码

3.常见错误码及其含义

以下是 POSIX 标准定义的部分常见错误码(完整列表可通过man errno查看):

二.errno使用

1.检查函数返回值

大多数库函数在失败时会返回特殊值(如NULL、-1),并设置errno:

#include <stdio.h>

#include <errno.h>

#include <string.h>

int main() {

    FILE* file = fopen("nonexistent.txt", "r");

    if (file == NULL) {

        // 检查errno并处理错误

        if (errno == ENOENT) {

            printf("文件不存在\n");

        } else if (errno == EACCES) {

            printf("权限不足\n");

        } else {

            printf("未知错误: %d\n", errno);

        }

    }

    return 0;

}

2.使用错误处理函数

C 标准库提供了两个常用函数来处理errno:

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

int main() {

    // 1. perror(): 打印自定义消息+系统错误信息

    FILE* file = fopen("nonexistent.txt", "r");

    if (file == NULL) {

        perror("打开文件失败");

        // 输出示例: "打开文件失败: No such file or directory"

    }

    // 2. strerror(): 返回错误码对应的字符串描述

    int error_code = errno;

    printf("error_code=%d; 错误描述: %s\n", error_code,strerror(error_code));

    // 输出示例: "错误描述: No such file or directory"

    return 0;

}

3.自定义错误处理函数

可以封装错误处理逻辑,提高代码可读性:

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

// 自定义错误处理函数

void handle_error(const char* msg) {

    fprintf(stderr, "%s: %s\n", msg, strerror(errno));

    exit(EXIT_FAILURE);

}

int main() {

    FILE* file = fopen("nonexistent.txt", "r");

    if (file == NULL) {

        handle_error("无法打开文件"); // 输出: "无法打开文件: No such file or directory"

    }

    return 0;

}

4.线程安全

(1)在多线程环境中,errno通常是线程局部的(每个线程有自己的errno副本),避免线程间干扰。

(2)及时检查

原因:成功的函数调用可能会重置errno,因此必须在函数失败后立即检查。

示例:

int value = atoi("not_a_number");

if (value == 0) {

    // 错误!无法判断是输入"0"还是转换失败

    if (errno == EINVAL) {

        // 这里的检查可能无效,因为atoi成功时可能重置errno

    }

}

(3)重置errno

在关键调用前手动将errno置零,确保错误码来自当前操作:

errno = 0;

int fd = open("file.txt", O_RDONLY);

if (fd == -1) {

    // 此时errno一定来自open()

    perror("打开文件失败");

}

三.总结

1.errno是 C 语言中处理系统错误的核心机制,使用时需注意:

先检查函数返回值,再判断errno;

及时处理错误,避免被后续操作覆盖;

结合perror()或strerror()提高错误信息可读性;

多线程环境中无需担心线程间干扰。

相关文章:

  • 绿色建筑发展新动能:楼宇自控助力实现高效节能减排
  • 2025年- H82-Lc190--322.零钱兑换(动态规划)--Java版
  • 【系统设计【4】】设计一个限流器:从理论到实践的完整解决方案
  • 【FreeRTOS实战】一章速通freertos含扩展MQTT,SD卡,
  • Java + Spring Boot + MyBatis 枚举变量传递给XML映射文件做判断
  • 6.17 note
  • 【AI News | 20250617】每日AI进展
  • JDBC强化关键_009_连接池
  • react 状态改变引发视图频繁更新,怎么优化
  • k均值聚类+成分分析降维+自编码器降维
  • Spring三层架构
  • VS和VS Code 对比和区别
  • Springboot整合ollama运行本地AI大模型
  • 利用Enigma Virtual Box将QT生成的软件打包成一个exe可执行文件
  • C++ map代码练习 1、2、priority_queue基础概念、对象创建、数据插入、获取堆顶、出队操作、大小操作,自定义结构、代码练习 1 2
  • Linux -- Ext系列文件系统介绍
  • 游戏引擎学习路径与技术栈指南
  • python+uniapp微信小程序的共享雨伞租赁系统
  • Day.34
  • JVM: 内存、类与垃圾
  • 推广普通话内容50字/杭州seo搜索引擎优化公司
  • 金华住房和城乡建设部网站/能去百度上班意味着什么
  • 国内站长做国外网站/企业员工培训课程内容
  • 做网站书/微营销系统
  • 兴化网站建设/2345网址导航怎么彻底删掉
  • 做农业需关注什么网站/2022最新热点事件及点评