C语言——错误处理机制errno

news2024/9/21 14:47:21

前言

在C语言中,错误处理主要是通过全局变量 errno 和相关的错误处理函数来实现的。errno 是一个全局整型变量,用于存储最近发生的系统调用或库函数调用失败的原因。当一个系统调用或库函数调用失败时,通常会设置 errno 的值,并返回一个指示错误的值。

一、errno 变量作用

1. 系统调用失败:当系统调用(如 open(), read(), write(), fork(), exec(), wait() 等)失败时,会设置 errno。

2. 库函数调用失败:当标准库函数(如 fopen(), fread(), fwrite(), strtok(), malloc(), realloc(), free() 等)失败时,也会设置 errno

errno 的值errno 的值是一个整数,表示不同的错误原因。常见的 errno 错误码及其含义如下:

详细见收藏errno文章。

二、获取和设置 errno 的值

1.直接显示errno值

代码示例:

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

int main()
{
    int result = close(5);//假设5不是一个有效的文件描述符
    if(result == -1)
    {
        int err = errno;
        printf("Close failed with error code:%d\n",err);
    }
    return 0;
}

运行结果:输出结果9对应错误代码的含义

 

2.perror():打印错误消息,并附加 errno 的解释。

代码示例:

#include <stdio.h>
#include <string.h>
#include <error.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd = open("example.txt",O_RDONLY);
    if(fd == -1){
        perror("Error opening file");//打印错误消息,并附加errno的解释
        return -1;
    }

    char buffer[256];
    ssize_t bytesRead = read(fd,buffer,sizeof(buffer)-1);
    if(bytesRead == -1)
    {
        perror("Error reading from file");//打印错误消息,并附加errno的解释
        close(fd);
        return 1;
    }

    buffer[bytesRead] = '\0';
    printf("Content of the file:%s\n",buffer);

    close(fd);//关闭文件描述符
    return 0;
}

运行结果:如果没有example.txt文本文件,会报如下错误

 

3.strerror():将 errno 的值转换为字符串描述。

代码示例:

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

int main()
{
    int result = close(5);//假设5不是一个有效的文件描述符
    if(result == -1){
        printf("Close failed with error:%s\n",strerror(errno));
    }
    return 0;
}

运行结果:

 

errno:全局变量,可以直接读取或设置。

总结

在 C 语言中,errno 是一个全局变量,用于存储最近发生的错误的编号。通过检查 errno 的值以及使用相关的错误处理函数(如 perror(), strerror()),可以有效地进行错误处理和调试。合理的错误处理机制能够提高程序的健壮性和用户的体验。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS笔记3.路径规划1

在 Rviz 中可视化路径规划move_base 节点的基本概念什么是Global Planner&#xff1f;什么是Global Costmap&#xff1f; 在 Rviz 中可视化路径规划 对于本章&#xff0c;您基本上需要使用 RViz 的 3 个元素&#xff1a; Map Display (Costmaps)Path Displays (Plans)2D 工具 …

Linux 系统盘空间不足,想要将 Docker 镜像和容器数据迁移到数据盘

摘要&#xff1a;大家在Linux上用Docker部署项目的时候&#xff0c;有时候会部署多个项目&#xff0c;系统盘空间不足&#xff0c;数据盘又挂载有很多空间&#xff0c;这时候就会想要将 Docker 镜像和容器数据迁移到数据盘&#xff0c;本文主要讲解迁移步骤和迁移过程中遇到的一…

轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数

示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]示例 2: 输入&#xff1a;nums [-1,-100,3,99], k 2 输出&#xff1a;[3,99,-1,-100] 解释: 向右…

Spring-IOC容器-ApplicationContext

IOC:Inversion of Control 控制反转&#xff0c;是一种设计原则&#xff0c;spring 中通过DI&#xff08;dependency Injection&#xff09;来具体实现。 比如原本对象的实例化&#xff0c;是通过程序主动New出来&#xff0c;IOC中的对象实例交给Spring框架来实例化&#xff0…

形而上学(Metaphysics)

讯飞星火 形而上学&#xff08;Metaphysics&#xff09;是哲学的一个门类&#xff0c;主要研究世界的本质、存在者的存在原因及本源等问题。它旨在探讨超越物理世界的抽象概念和原则 。 形而上学最早由亚里士多德提出&#xff0c;被称为“第一哲学”或“第一科学”。这个术语…

基于R语言的统计分析基础:使用dplyr包进行数据操作

dplyr是R语言中一个功能强大且流行的数据操作包&#xff0c;它提供了一系列用于数据清洗、转换、汇总和可视化的工具。这些工具包括选择列、过滤行、排序、添加或修改列、汇总数据以及分组和合并数据集的函数。dplyr的设计使得数据操作变得简单直观&#xff0c;同时保持高性能&…

鹏哥C语言自定义笔记重点(67-)

67. 68. 69. 70. 71.结构体内容 72.理解结构体的字节数 73. #pragma once //头文件中使用&#xff0c;功能是:防止头文件被多次引用 74.结构体传参 结论:结构体传参时&#xff0c;要传结构体地址。 75.位段 76.static是只能在该文件中看到&#xff0c;其他地方看不到 77.…

Linux 文件 IO 管理(第一讲)

Linux 文件 IO 管理&#xff08;第一讲&#xff09; 回顾 C 语言文件操作&#xff0c;提炼理解新创建的文件为什么被放在可执行文件的同级目录下&#xff1f;上述 log.txt 何时被创建&#xff1f;又是谁在打开它&#xff1f;那文件没有被打开的时候在哪里&#xff1f;一个进程可…

柳淘鸿美业大健康:开启消费赚钱新时代!

随着消费升级和健康意识的不断提高&#xff0c;柳淘鸿美业大健康正式宣布开启消费赚钱新时代&#xff01;这家引领行业潮流的公司以其创新的商业模式和独特的产品组合&#xff0c;正在改变人们对美业和健康产业的认知。 柳淘鸿美业大健康作为国内领先的新零售赋能中心&#xf…

19. 网络结构搭建实例

网络结构搭建实例 1. 网络结构图 图示为适应 cifar10 数据集的一个网络结构图&#xff0c;本文主要针对于复现如下网络结构&#xff0c;并介绍相关函数的使用 2. 网络结构各层参数分析 复现网络结构前需要对各层的参数进行分析 第一层&#xff1a;Input (3*32*32) --> C…

2024年<9月版>宠物空气净化器推荐,希喂、霍尼韦尔、IAM吸毛吗

宠物空气净化器现在是每个养宠家庭都必不可少的家电&#xff0c;我们可以没有吸尘器、扫地机器人&#xff0c;但绝对不能没有宠物空气净化器&#xff01;有了宠物空气净化器就可以帮我们解决浮毛这一大难题&#xff0c;特别是换季时节&#xff0c;宠物开始换毛&#xff0c;有了…

leetcode hot100_part4_子串

2024/4/20—4/21 560.和为K的子数组 前缀和哈希表&#xff0c;做二叉树的时候也有这个套路。注意细节&#xff0c;遍历到当前前缀和的时候是先找结果个数还是先加入哈希&#xff1f;应该先找结果个数&#xff0c;不然的话&#xff0c;当前位置也算上了&#xff08;因为是前缀和…

【网络安全】-文件上传漏洞

文件操作漏洞包括文件上传漏洞&#xff0c;文件包含漏洞&#xff0c;文件下载漏洞。 文章目录 前言 什么是文件上传漏洞&#xff1f; 文件上传的验证与绕过&#xff1a; 1.前端js验证&#xff1a;   Microsft Edge浏览器&#xff1a; Google Chrome浏览器&#xff1a; 2.后端…

【jvm】记一次hive堆heap内存溢出的排查

先看下java的内存模型 监控jvm工具&#xff1a;visualVM 摘录一下内容&#xff1a; 由c开发的jvm&#xff0c;它巧妙地设计了java的设计理念——即万物皆对象。并设计了这些对象应该如何存储&#xff0c;如何调用&#xff0c;并通过不断迭代设计让对象的存储和回收&#xff0…

最新安装vmware地址(官网找半天没找到)

CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop 直接走这个点进去&#xff0c;windows点ws&#xff0c;linux和mac点fusion进去下对应版本 win为例子&#xff1a;CDS Repository - /var/www/public/stage/session-50/cds/vmw-desktop/ws/17.6.0/242380…

MyBatis中一对多关系的两种处理方法

目录 1.多表联查&#xff08;通过collection标签的ofType属性&#xff09; 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.分布查询(通过collection标签的select属性) 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff0…

铁路输电线路异物检测数据集

铁路输电线路异物检测数据集&#xff0c;共6GB&#xff0c;14000余图像&#xff0c;40000标注&#xff0c;标注鸟巢&#xff0c;塑料袋&#xff0c;气球&#xff0c;漂浮物四大类。coco格式标注。 项目背景&#xff1a; 铁路输电线路是保障铁路运输安全的重要组成部分&#xf…

Golang | Leetcode Golang题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; func toHex(num int) string {if num 0 {return "0"}sb : &strings.Builder{}for i : 7; i > 0; i-- {val : num >> (4 * i) & 0xfif val > 0 || sb.Len() > 0 {var digit byteif val < 10 {digit 0…

小程序组件间通信

文章目录 父传子子传父获取组件实例兄弟通信 父传子 知识点&#xff1a; 父组件如果需要向子组件传递指定属性的数据&#xff0c;在 WXML 中需要使用数据绑定的方式 与普通的 WXML 模板类似&#xff0c;使用数据绑定&#xff0c;这样就可以向子组件的属性传递动态数据。 父…

随机森林算法介绍

文章目录 基本原理关键步骤举例说明算法流程优点缺点实现示例总结 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;主要用于分类和回归任务。它通过集成多棵决策树来提高模型的准确性和泛化能力。以下是随机森林的详细算法介绍&#xff1a; 基本…