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()提高错误信息可读性;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电阻、电容、电感

目录 前言一、电阻1.阻值识别 二、电容1.注意事项2.电容特性3.相对电压不能突变4.储能特性5.稳定电压&#xff08;滤波&#xff09;6.容抗7.低通滤波RC8.高通滤波CR 三、电感1.特性2.注意事项3.感抗4.低通滤波LR5.高通滤波RL6.疑问 四、LC低通滤波 前言 基础知识可以看个人笔记…

Docker学习笔记:数据卷

本文是自己的学习笔记 1、数据卷基本概念2、数据卷示例3、数据卷的权限控制4、数据卷的创建方式5、数据卷容器 1、数据卷基本概念 数据卷就是docker容器产生的数据&#xff0c;如果不通过docker commit生成新的镜像&#xff0c;使得数据做为镜像的一部分保存下来&#xff0c;那…

内存泄漏到底是个什么东西?如何避免内存泄漏

目录 内存泄漏到底是个什么东西&#xff1f;如何避免内存泄漏 一、什么是内存泄漏&#xff1f; 1、内存泄漏 2、GC&#xff08;垃圾回收&#xff09;机制是什么&#xff1f; 二、常见内存泄漏场景 1、意外的全局变量 2、被遗忘的定时器/回调 3、闭包未释放大对象 4、D…

【图像处理入门】8. 数学基础与优化:线性代数、概率与算法调优实战

摘要 图像处理的核心离不开数学工具的支撑。本文将深入解析线性代数、概率论在图像领域的应用,包括矩阵变换与图像几何操作的关系、噪声模型的数学描述,以及遗传算法、粒子群优化等智能算法在参数调优中的实践。通过理论结合代码案例,帮助读者掌握从数学原理到工程优化的完…

包含30个APP客户端UI界面的psd适用于旅游酒店项目

包含30个APP客户端UI界面的psd适用于旅游酒店项目 此资源包含30个完全可编辑的psd界面组成。内容包括欢迎页、登录、注册、首页、搜索、侧边菜单、用户中心、个人介绍、用户空间、产品详细信息、酒店预定、天气情况等各种常用界面&#xff0c;您可以将其用于旅游酒店类的APP应用…

华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio搭建PandaWiki知识库问答系统

华为云FlexusDeepSeek征文 | 基于华为云ModelArts Studio搭建PandaWiki知识库问答系统 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、PandaWiki介绍PandaWiki 简介主要特点 三、安装PandaWiki应用一键部署方式访问PandaWiki系统 四…

Python应用八股文

大家好!在 Python 学习的道路上&#xff0c;掌握一些基础知识要点至关重要&#xff0c;这些要点常被称为“Python 八股”。以下是对它们的简易总结&#xff0c;帮助你快速回顾和巩固 Python 的核心概念。 一、数据结构 列表&#xff08;List&#xff09;&#xff1a;有序可变序…

在 CentOS中安装Docker并安装青龙脚本——笔记

安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加 Docker 官方 GPG 密钥 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装 Docker 引擎 sudo yum install -y docker-ce docker-ce-cli con…

MySQL分库分表面试题深度解析

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 MySQL分库分表面试题深度解析一、核心概念与…

AI首次自主发现人工生命

转&#xff1a; 近日&#xff0c;人工智能领域迎来了一项革命性的突破。Transformer 论文作者之一的 Llion Jones 与前谷歌研究人员 David Ha 共同创立的人工智能公司 Sakana AI&#xff0c;联合MIT、OpenAI、瑞士AI实验室IDSIA等机构的研究人员&#xff0c;共同提出了一种名为…

企业架构框架深入解析:TOGAF、Zachman Framework、FEAF与Gartner EA Framework

执行摘要 企业架构&#xff08;EA&#xff09;是一项至关重要的实践&#xff0c;它使组织能够协调其业务战略、运营流程和技术基础设施&#xff0c;以实现整体战略目标。企业架构框架作为结构化的方法论和综合性工具&#xff0c;旨在管理企业级系统的固有复杂性&#xff0c;提…

[7-01-03].第03节:环境搭建 - 集群架构

RabbitMQ学习大纲 一、使用集群的原因 1.基于以下原因&#xff0c;需要搭建一个 RabbitMQ 集群来解决实际问题 单机版的&#xff0c;无法满足目前真实应用的要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;会导致rabbitMQ无法提供服务单台 R…