《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章,按理说应该在前面就讲了

头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误的信息

程序开始执行时,变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会将errno设置为相应的错误码。函数被成功调用时,它们不修改errno的值。因此,当一个函数被成功调用,errno的值可能不为零,它的非零值由前面的函数设置。所以不能根据errno的值来判断一个函数执行是否成功。当函数调用失败时( 函数返回-1或NULL),errno 值才有意义。

示例程序1

以下是一个示例程序,改程序通过打开一个文件,如果由于某种原因文件不能被打开时,就可以得到一个相应的errno值,检查其对应错误码,可以得到错误的原因。

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main(){
    FILE *stream;
    char *filename="test";
    errno=0;
    stream=fopen(filename,"r");//这个是C语言的文件打开,和之前讲的Linux的不一样,不过效果都是一样的
    if(stream==nullptr)
        printf("open file %s failed,errno is %d\n",filename,errno);
    else printf("open file %s successfully\n",filename);
}

如果是文件不存在的情况下运行,结果如下

 2对应的错误码是ENOENT,然后就知道错误原因是:文件或目录不存在。

错误码

错误码是定义在errno.h中的宏,通常以字母E开头,后面由一串大写字母或数字组成。

以下是一些错误码的宏,当然不可能说全记住,看看就好。

  1. 成功:

    • 宏:0
    • 描述:表示操作成功完成。
  2. 通用错误:

    • 宏:EINVAL
    • 描述:无效的参数。
  3. 文件相关错误:

    • 宏:ENOENT
    • 描述:文件或目录不存在。
    • 宏:EEXIST
    • 描述:文件或目录已存在。
  4. 内存相关错误:

    • 宏:ENOMEM
    • 描述:内存不足。
  5. 权限相关错误:

    • 宏:EACCES
    • 描述:权限不足。
  6. 网络相关错误:

    • 宏:ECONNREFUSED
    • 描述:连接被拒绝。
    • 宏:ETIMEDOUT
    • 描述:操作超时。
  7. 管道和进程相关错误:

    • 宏:EPIPE
    • 描述:管道破裂。
  8. socket 相关错误:

    • 宏:EADDRINUSE
    • 描述:地址已经在使用中。
    • 宏:EADDRNOTAVAIL
    • 描述:地址不可用。
  9. IO 相关错误:

    • 宏:EIO
    • 描述:IO 错误。
  10. 数学库相关错误:

    • 宏:EDOM
    • 描述:域错误。
    • 宏:ERANGE
    • 描述:结果太大,无法表示。
  11. 线程相关错误:

    • 宏:EPERM
    • 描述:操作不允许。
  12. 信号相关错误:

    • 宏:EINTR
    • 描述:被中断的系统调用。

错误的提示信息

出现错误时,可以打印出相应的错误提示信息。

strerror函数

#include<string.h>
char *strerror(int errnum);

这个函数在头文件string.h中声明。它会根据参数errnum提供的错误码获取一个描述错误信息的字符串,函数的返回值为指向该字符串的指针。errnum的值通常就是errno。

perror函数

这个函数我好早之前就介绍过了,《Linux C编程实战》笔记:文件读写-CSDN博客

#include<stdio.h>
void perror(const char *message);

 perror()打印错误信息到stderr, stderr 在Linux中通常就是指屏幕或命令行终端。调用perror()时,
如果参数message是一个空指针,perror 仅仅根据errno打印出对应的错误提示信息。如果提供一
个非空的值,perro会把此message加在其输出信息的前面。perror会添加一个冒号和空格message
和错误信息分开,以便区分。

示例程序2

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
FILE *open_file(const char *filename){
    FILE *stream;
    errno=0;
    stream=fopen(filename,"r");
    if(stream==nullptr){
        printf("can not open the file %s. reason:%s\n",filename,strerror(errno));//用strerror获得错误的信息
        exit(-1);
    }
    else return stream;
}
int main(){
    const char *filename="test";
    open_file(filename);
    return 0;
}

strerror实际上就是通过之前的错误码得到错误码对应的错误信息字符串,然后打印出来。

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

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

相关文章

排序算法9----计数排序(C)

计数排序是一种非比较排序&#xff0c;不比较大小 。 1、思想 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 2、步骤 1、统计数据&#xff1a;统计每个数据出现了多少次。&#xff08;建立一个count数组&#xff0c;范围从[MIN,MAX],MAX代表arr中…

关于gltf模型格式文件的学习

目录 glTF模型 小黄鸭的gltf模型 字段分析 scene nodes meshes primitives attributes indices mode material accessors bufferView byteOffset count componentType type materials textures images samplers magFilter与minFilter wrapS与wrapT 进行…

10个用于Android开发的有用的Kotlin库及示例

10个用于Android开发的有用的Kotlin库及示例 在Android开发领域&#xff0c;Kotlin已成为一门领先的语言&#xff0c;带来了现代语法和功能的浪潮。随着Kotlin的崛起&#xff0c;涌现出了许多专为其定制的库&#xff0c;进一步增强了开发体验。本文将深入介绍其中的10个库&…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

C语言从入门到实战——动态内存管理

动态内存管理 前言一、 为什么要有动态内存分配二、 malloc和free2.1 malloc2.2 free 三、calloc和realloc3.1 calloc3.2 realloc 四、常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释放一块动态开…

赤藓糖醇行业研究:预计2029年将达到3.5亿美元

赤藓糖醇是一种四碳糖醇&#xff0c;存在于多种食物中&#xff0c;如葡萄、梨、西瓜等&#xff0c;可由微生物发酵法和化学合成法两种方法制备&#xff0c;目前商业化生产中均采用微生物发酵法。赤藓糖醇由葡萄糖发酵制作而成&#xff0c;上游原料主要包括葡萄糖、玉米淀粉糖和…

Android中的anr定位指导与建议

1.背景 8月份安卓出现了一次直播间卡死(ANR)问题&#xff0c;且由于排查难度较大&#xff0c;持续了较长时间。本文针对如何快速定位安卓端出现ANR问题进行总结和探讨. 这里大致补充一下当时的情况,当时看到情景的是从某一个特定的场景下进入直播间后整个直播间界面立刻就卡住…

23年11月移动广告行业大盘趋势,借鉴双 11 ,年货节该如何提高广告收益

前言 年货节开始啦&#xff0c;我们可以借鉴2023年双11期间的广告大盘趋势&#xff0c;洞悉如何在大型促销期间调整广告运营策略以提升效果。年货节是一个绝佳的时机&#xff0c;可以利用在双11期间积累的经验和策略&#xff0c;进行相应的调整和优化。通过精准定位广告投放高…

Elasticsearch:和 LIamaIndex 的集成

LlamaIndex 是一个数据框架&#xff0c;供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的&#xff0c;可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…

maven无法识别本地maven仓库包解决方案

前言&#xff1a;由于本地maven仓库已经有了相关依赖包&#xff0c;idea还是去远程仓库下载(不知何原因&#xff0c;生产上到远程仓库的网络突然不通了)&#xff0c;故需要自己本地上传相关包到生产主机并修改setttings文件来强制读取本地仓库方案 settings文件修改如下方式即…

iPad如何连接到Wi-Fi,这里提供详细步骤

这篇文章解释了如何将iPad连接到Wi-Fi&#xff0c;无论是公共Wi-Fi网络还是需要密码的专用网络。 将iPad连接到Wi-Fi 当你想让iPad联机时&#xff0c;请按照以下步骤连接到Wi-Fi&#xff1a; 1、在iPad的主屏幕上&#xff0c;点击设置。 2、点击Wi-Fi。 3、要启动iPad搜索附…

数据库作业三

1.创建student和score表 2.为student表和score表增加记录 3.查询student表的所有记录 4.查询student表的第2条到4条记录 5.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 6.从st…

Zabbix6.4 图形乱码怎么办

Zabbix6.4 图形乱码怎么办 Zabbix6.4 安装后&#xff0c;进入主机图形展示&#xff0c;你会发现文字部分乱成了乱码。 找一台Microsoft Windows 7/10/11的电脑&#xff0c;打开C:\Windows\Fonts 找到【楷体 常规】&#xff0c;将字体复制到桌面。 桌面上就会多出simkai.ttf字…

5.2 基于深度学习和先验状态的实时指纹室内定位

文献来源 Nabati M, Ghorashi S A. A real-time fingerprint-based indoor positioning using deep learning and preceding states[J]. Expert Systems with Applications, 2023, 213: 118889.&#xff08;5.2_基于指纹的实时室内定位&#xff0c;使用深度学习和前一状态&…

抖音弹幕直播玩法汉字找不同文字找不同无人值执守自动玩游戏自带语音播报的开发日志

#找不同# 要解决如下几个问题&#xff1a; 1.声音sprite的录制和调用&#xff0c;解决方案以及解决库如下&#xff1a; howler.min.js://一款不错的音频播放js库。 2.鼠标自动飘浮,使用的库 anime.min.js 3.资源预加载 preload.min.js 4.其它使用到的库 jquery,vue

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…

开放式耳机哪个品牌好?2024最新开放式耳机选购指南!实测避雷!

如果你是一个对音质和舒适度有要求的人&#xff0c;那么你一定要看看开放式耳机了&#xff0c;开放式耳机不是像封闭式耳机那样堵着耳朵&#xff0c;它能够提供更宽广的音场和更自然声音&#xff0c;佩戴也更加舒适&#xff0c;那么哪个品牌的开放式耳机最好呢&#xff1f;接下…

新能源汽车智慧充电桩解决方案:智慧化综合管理与数字化高效运营

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩解决方案基于管理运营平台&#xff0c;覆盖业务与应用、数据传输与梳理、多端开发、搭建等模块&#xff0c;融合AI、5G、Wi-Fi 、移动支付等技术&#xff0c;实现充电基础设施由数字化向智能化演进&#xff0c;通过构…

使用Go语言处理Excel文件的完整指南

xcel文件是广泛用于存储和处理数据的常见文件格式。在Go语言中&#xff0c;有许多库和工具可用于处理Excel文件。本文将介绍如何使用Go语言处理Excel文件&#xff0c;包括读取、写入和修改Excel文件&#xff0c;以及处理单元格、行和列等操作。无论是从头开始创建Excel文件&…

【开源】基于JAVA语言的快乐贩卖馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…