Linux 系统错误处理简介

Linux 系统错误处理简介

      • 1. `errno`:错误代码的载体
      • 2. `strerror()`:错误信息的翻译官
      • 3. `perror()`:便捷的错误信息输出
      • 4. 系统调用与库函数的区别
      • 5. 错误处理的最佳实践

在 C/C++ 程序开发中,我们经常需要处理各种错误情况
Linux 系统提供了一套完善的错误处理机制,通过全局变量 errno 和相关的库函数,我们可以方便地定位和处理错误

1. errno:错误代码的载体

errno 是一个整型的全局变量,定义在 <errno.h> 头文件中。当一个函数调用发生错误时,通常会将相应的错误代码存储在 errno 中。通过检查 errno 的值,我们可以判断函数调用是否成功以及失败的原因。

需要注意的是:

  • 并非所有库函数在调用失败时都会设置 errno 的值。只有属于系统调用的函数才会设置 errno。可以通过 man 手册来确认某个函数是否会设置 errno
  • errno 不能作为判断库函数调用是否失败的唯一标志。正确的做法是先检查函数的返回值,只有当返回值表明函数调用失败时,才需要关注 errno 的值。
  • errno 的值只有在库函数调用发生错误时才会被设置,当库函数调用成功时,errno 的值不会被修改,也不会主动置为 0。

2. strerror():错误信息的翻译官

strerror() 函数定义在 <string.h> 头文件中,用于将错误代码转换为相应的错误信息字符串。

char *strerror(int errnum);            // 非线程安全
int strerror_r(int errnum, char *buf, size_t buflen);    // 线程安全

其中,errnum 是错误代码,strerror() 返回一个指向错误信息字符串的指针。strerror_r()strerror() 的线程安全版本,它将错误信息存储在用户提供的缓冲区 buf 中。

3. perror():便捷的错误信息输出

perror() 函数定义在 <stdio.h> 头文件中,用于在控制台输出最近一次系统错误的详细信息。

void perror(const char *s);

perror() 接受一个字符串 s 作为参数,它会将 s 和最近一次系统错误的描述信息一起输出到标准错误流(stderr)。在实际开发中,由于服务程序通常在后台运行,通过控制台显示错误信息意义不大。perror() 主要用于调试程序。

4. 系统调用与库函数的区别

在讨论 errno 的适用范围时,我们提到了“系统调用”的概念。理解系统调用与库函数的区别对于理解 Linux 系统错误处理至关重要。

系统调用是操作系统内核提供给用户程序的一组接口,用于访问操作系统提供的各种服务,例如文件 I/O、进程管理、内存管理等。系统调用直接与内核交互,运行在内核态。

库函数是程序员为了方便开发而封装的一系列函数,它们通常是对系统调用的封装或组合,也可能不涉及系统调用。库函数运行在用户态。

以下是系统调用与库函数的一些主要区别:

特性系统调用库函数
定义操作系统内核提供的接口程序员封装的函数
运行空间内核态用户态
可移植性不同操作系统之间通常不同遵循标准(如 ANSI C)则可移植性较好
性能开销较大(需要用户态和内核态切换)开销较小
功能提供最基本、最底层的操作系统服务提供更高级、更方便的功能
errno通常会设置 errno并非都会设置 errno

举例来说,open()read()write() 等是系统调用,而 fopen()fread()fwrite() 等是库函数。fopen() 等库函数底层会调用相应的系统调用来完成文件操作。

5. 错误处理的最佳实践

在实际开发中,我们应该遵循以下几点:

  • 始终检查函数的返回值,判断函数调用是否成功。
  • 只有当返回值表明函数调用失败时,才需要关注 errno 的值。
  • 使用 strerror()perror() 获取详细的错误信息,方便定位问题。
  • 根据不同的错误类型采取相应的处理措施,例如重试、记录日志、退出程序等。
  • 在多线程环境下,应使用 strerror_r() 等线程安全的函数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

Flutter 改完安卓 applicationId 后App 闪退问题。

一、问题 当我们项目创建完&#xff0c;想 build.gradle 改 applicationId 的时候&#xff0c;再次执行的时候可能会出现 app 闪退问题&#xff0c; 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。&#xff08;像下方这样&#xff0c; 而 app 只是在模拟器中一闪而…

JavaScript笔记APIs篇01——DOM获取与属性操作

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

回归人文主义,探寻情感本质:从文艺复兴到AI时代,我的情感探索之旅

回归人文主义&#xff0c;探寻情感本质&#xff1a;从文艺复兴到AI时代&#xff0c;我们的情感探索之旅 多年来&#xff0c;我们的团队一直关注人工智能&#xff0c;尤其是AI在音乐领域的应用研究。随着技术的不断演进&#xff0c;我们也不断反思&#xff1a;在“算法、代码、…

【java】签名验签防篡改研究测试

上一篇文章写了接口安全通过一次性校验码和 时间戳可以防接口重放攻击、本篇将通过 signatrue签名模式进行研究性&#xff0c;知其所以然 说明本次实验是验证签名合法性该前端使用不安全加密&#xff0c;存在安全风险密钥在jsp中暴露 1、实现原理 2、前端 将 username 和 p…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

Java实现简易银行账户管理系统

目录 1、项目概述 1.1 项目结构 1.2 技术栈 2、核心功能说明 2.1 账户管理 2.2 异常处理体系 3、设计理念解析 3.1 面向对象设计 3.2 关键设计点 4、使用指南 4.1 运行流程 4.2 注意事项 5、扩展建议 5.1增加功能 5.2优化方向 6、主要的功能模块代码说明 6.1exception 6.2main …

【2024年华为OD机试】(B卷,100分)- 数据分类 (Java JS PythonC/C++)

一、问题描述 题目描述 对一个数据a进行分类,分类方法为: 此数据a(四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。 比如一个数据a=0x010…

使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Next.js:构建大模型智能体GPT研究者应用的 Web开发框架

Next.js&#xff1a;构建大模型智能体GPT研究者应用的 Web开发框架 Next.js 基础知识 Next.js 是由 Vercel 公司开发维护的框架&#xff0c;极大地简化了 React 应用的开发流程。其核心特性包括&#xff1a; 服务器端渲染&#xff08;SSR&#xff09;与静态站点生成&#xff…

Redis vs. 其他数据库:深度解析,如何选择最适合的数据库?

一、如何为项目选择合适的数据库&#xff1f; 选择合适的数据库是一个复杂的过程&#xff0c;需要综合考虑多个因素。下面几个维度来详细阐述&#xff1a; 1.数据模型 关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;适用于高度结构化、关联性强的数据&#xff0c;如电…

Linux内存管理(Linux内存架构,malloc,slab的实现)

文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念&#xff1a;分页管理的核心概念&#xff1a;Linux 中分页的实现&#xff1a;总结&#xff1a; 六、伙伴算法伙伴算法的核心…

[Computer Vision]实验二:图像特征点提取

目录 一、实验内容 二、实验过程及结果 2.1 Harris角点检测 2.2 SIFT算法 三、实验小结 一、实验内容 采用Harris与SIFT分别提取特征点及对应的描述子&#xff0c;对比两者的区别&#xff08;特征点数量、分布、描述子维度、图像变化对二者的影响等&#xff09;利用特征匹…

运算放大器应用电路设计笔记(六)

6.1输出失调电压发生的原因与计算 6.1.1用噪声增益进行评价 若运算放大器两个输入端接地&#xff0c;则理想运放输出为零&#xff0c;但实际的运放输出不为零&#xff0c;有一定的直流输出电压。这种直流电压称为输出失调电压。发生的原因是&#xff0c;运算放大器内部元件尤…

Ubuntu 24.04 LTS 通过 docker 安装 nextcloud 搭建个人网盘

准备 Ubuntu 24.04 LTSUbuntu 空闲硬盘挂载Ubuntu 安装 Docker DesktopUbuntu 24.04 LTS 安装 tailscale [我的Ubuntu服务器折腾集](https://blog.csdn.net/jh1513/article/details/145222679。 安装 nextcloud 参考 Ubuntu24.04系统Docker安装NextcloudOnlyoffice _。 更…

第18个项目:微信开发入门:获取access_token的Python源码

源码下载地址:https://download.csdn.net/download/mosquito_lover1/90301829 功能特点: 输入AppID和AppSecret,点击按钮后异步获取access_token 1、自动保存功能: 当用户输入或修改 AppID 和 AppSecret 时自动保存 获取到新的 access_token 时自动保存 所有数据都保存在…

基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

基于springboot社区医院管理系统

基于Spring Boot的社区医院管理系统是一个综合性的信息化解决方案&#xff0c;旨在提升社区医院的管理效率、优化医疗服务流程以及增强患者体验。 一、系统背景与目的 随着医疗行业的快速发展和信息化建设的不断推进&#xff0c;社区医院作为基层医疗服务机构&#xff0c;面临…

ChatGPT大模型极简应用开发-CH2-深入了解 GPT-4 和 ChatGPT 的 API

文章目录 2.1 基本概念2.2 OpenAI API 提供的可用模型2.3 在 OpenAI Playground 中使用 GPT模型2.4 开始使用 OpenAI Python 库2.4.1 OpenAI 访问权限和 API 密钥2.4.2 Hello World 示例程序 2.5 使用 GPT-4 和 ChatGPT2.5.1 ChatCompletion 端点的输入选项2.5.2 ChatCompletio…