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

news2024/11/27 8:25:29

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

头文件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实际上就是通过之前的错误码得到错误码对应的错误信息字符串,然后打印出来。

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

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

相关文章

oracle篇—19c新特性自动索引介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

unity SqLite读取行和列

项目文件 链接&#xff1a;https://pan.baidu.com/s/1BabHvQ-y0kX_w15r7UvIGQ 提取码&#xff1a;emsg –来自百度网盘超级会员V6的分享 using System.Collections; using System.Collections.Generic; using UnityEngine; using Mono.Data.Sqlite; using System; using Syste…

【计算机网络】【新加坡南洋理工大学】【Computer Control Network】【广域网和局域网简介】【中英对照(自译)】

一、说明 仅供学习使用。 二、广域网&#xff08;WAN&#xff09;和局域网&#xff08;LAN&#xff09;简介

21所考408的院校有哪些?

计算机考研一直是考研的热门&#xff0c;那么在决定要参加计算机考研的时候&#xff0c;就要确定自己的复习方向&#xff0c;主流的复习方向有两类&#xff0c;一类是统考&#xff0c;也就是大家常说的408&#xff0c;还有一类是自命题&#xff0c;每一个学校的自命题都有所区别…

Windows10配置Maven环境变量

Windows10配置Maven环境变量 1.首先鼠标右键【此电脑】&#xff0c;点击【属性】2.点击【高级系统设置】3.点击【环境变量】4.创建【MAVEN_HOME】变量&#xff0c;变量值为maven的安装目录5.点击【Path】变量&#xff0c;点击【编辑】按钮6.点击【新建】按钮&#xff0c;输入【…

数据结构:顺序栈

栈是一种先进后出的数据结构&#xff0c;只允许在一端&#xff08;栈顶&#xff09;操作&#xff0c;代码中top表示栈顶。 stack.h /* * 文件名称&#xff1a;stack.h * 创 建 者&#xff1a;cxy * 创建日期&#xff1a;2024年01月17日 * 描 述&#xff1a; …

k8s的对外服务---ingress

service的作用体现在两个方面&#xff1a; 集群内部&#xff1a;不断追踪pod的变化。他会更新endpoint中的pod对象&#xff0c;基于pod的IP地址不断变化的一种服务发现机制。 集群外部&#xff1a;类似负载均衡器&#xff0c;把流量IP端口&#xff0c;不涉及转发url(http、htt…

【k8s】Kubernetes技术和相关命令简介

一、 Kubernetes简介 Kubernetes是Google开源的一个容器编排引擎&#xff0c;它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时&#xff0c;通常要部署该应用的多个实例以便对应用请求进行负载均衡。kubernetes&#xff0c;简称K8s&#xff0…

《Redis:NoSQL演进之路与Redis深度实践解析》

文章目录 关于NoSQL为什么引入NoSQL1、单机MySQL单机年代的数据库瓶颈 2、Memcached&#xff08;缓存&#xff09; MySQL 垂直拆分 &#xff08;读写分离&#xff09;3、分库分表水平拆分MySQL集群4、如今的网络架构5、总结 NoSQL的定义NoSQL的分类 Redis入门Redis能干嘛&…

敏捷测试和DevOpes自动化测试的区别

敏捷测试和DevOps自动化测试在以下方面存在区别&#x1f447; 1️⃣目标 &#x1f388;敏捷测试的主要目标是提供快速的反馈和持续的改进&#xff0c;以便在开发过程中尽早发现和解决问题&#xff0c;从而提高软件的质量和可靠性。 &#x1f308;DevOps自动化测试的目标是提高软…

Vue3中动态组件使用

一&#xff0c;动态组件使用&#xff1a; 应用场景&#xff1a;动态绑定或切换组件 应用Vue3碎片&#xff1a; is 1.使用 a.组件A <div class"layout-base"><Button>红茶</Button> </div>a.组件B <div class"layout-base"&g…

一、Flask学习之HTML

一、Flask学习之HTML 1.运行简单页面 首先需要搭建环境&#xff1a; pip install flaskfrom flask import Flaskapp Flask(__name__)# 创建了网址 /show/info 和函数index之间的对应关系&#xff0c;以后用户在浏览器上访问/show/info&#xff0c;网站自动执行index函数 ap…

从uptime看linux平均负载

从前遇到系统卡顿只会top。。top看不出来怎么搞呢&#xff1f; Linux系统提供了丰富的命令行工具&#xff0c;以帮助用户和系统管理员监控和分析系统性能。在这些工具中&#xff0c;uptime、mpstat和pidstat是非常有用的命令&#xff0c;它们可以帮助你理解系统的平均负载以及资…

【JMeter】JMeter连OceanBase数据库

1、下载OB&#xff08;OceanBase简称&#xff0c;下同&#xff09;&#xff0c;下载地址&#xff1a;https://www.oceanbase.com/softwarecenter-enterprise 2、将下载下来的jar包放到jmeter安装目录的 lib 目录下&#xff0c;或者打开JMeter客户端&#xff0c;在测试计划中引入…

maven 配置http私服Since Maven 3.8.1 http repositories are blocked. 报错处理

刷maven报错 com.saas:pdf:pom:0.0.1 failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of maven-default-http-blocker has elapsed or …

CTF CRYPTO 密码学-4

题目名称&#xff1a;奇怪的先生 题目描述&#xff1a; 描述:oss先生将三个培根的中间一只移到了左边,然后咬了一小口最后一根&#xff0c;说真好吃&#xff0c;真是个奇怪的先生&#xff01; 密文&#xff1a;VlM5WnlXc0ZibEhmMmE1ZHYxMDlhVkdmMlk5WmtRPT0 分析 应该是根据题…

【萤火虫系列教程】3/5-Adobe Firefly 创意填充

003-Adobe Firefly 创意填充 创意填充 登录账号后&#xff0c;在主页点击创意填充的【生成】按钮&#xff0c;进入到创意填充页面 我们可以上传自己的图像 一键抠图 点击【背景】就可以把主图抠出来 点击【反转】就可以把背景抠出来 点击【清除】就可以恢复到图片原来…

C语言之通过指针操作字符串

下面我们来学习通过指针来灵活操作字符串的方法 判断字符串的长度 我们用对指针的遍历来实现判断字符串的长度 #include <stdio.h> int str_length(const char*s) {int len 0;while(*s)len;return len; } int main() {char str[128];printf("请输入字符&#xff…

【项目管理】CMMI-原因分析与解决过程(CAR)

概述&#xff1a; “原因分析与解决”通过预防缺陷或者问题的引入以及识别并适当纳入优秀过程性能的原因&#xff0c;改进质量与生产率。 目录 1、文档结构 2、原因分析与解决过程域包括如下活动 3、选择需要加以分析的结果(启动条件) 4、过程活动与实践对照表 5、实例 1、…

【深度学习入门】深度学习基础概念与原理

*&#xff08;本篇文章旨在帮助新手了解深度学习的基础概念和原理&#xff0c;不深入讨论算法及核心公式&#xff09; 目录 一、深度学习概述 1、什么是深度学习&#xff1f; 2、深度学习与传统机器学习的区别 3、深度学习的应用领域 二、深度学习基本原理 1、神经网络的…