【C语言】函数strerror和perror详解


<>博客简介:Linux、rtos系统,arm、stm32等芯片,嵌入式高级工程师、面试官、架构师,日常技术干货、个人总结、职场经验分享

<>公众号:嵌入式技术部落

<>系列专栏:C/C++、Linux、rtos、嵌入式开发、流媒体、数据结构、网络协议、开源库、CMake、Makefile、架构设计模式等

文章目录

    • 一、前言
    • 二、函数perror
      • 函数作用
      • 头文件
      • 函数原型
      • 参数含义
      • 返回值
      • 注意点
      • 示例
    • 三、函数strerror
      • 函数作用
      • 头文件
      • 函数原型
      • 参数含义
      • 返回值
      • 注意点
      • 示例

一、前言

strerror函数和perror函数是C标准库中的两个函数,用于处理和显示错误信息。它们帮助程序员在程序运行过程中了解并诊断错误原因。

二、函数perror

函数作用

perror函数直接打印一条描述错误的消息,错误信息包括由errno指定的错误描述。

头文件

#include <stdio.h>

函数原型

void perror(const char *s);

参数含义

s:一个用户提供的前缀字符串,如果非空,则首先打印该字符串,然后打印一个冒号和空格,再打印errno指定的错误消息。

返回值

无返回值。

注意点

1、perror函数是线程安全的,因为它只读取errno的值并输出消息,不会修改任何全局状态。
2、perror函数基于全局变量errno的值来生成错误消息。因此,在调用perror之前,确保errno已经被设置为适当的错误代码。许多系统调用和库函数在失败时会自动设置errno。
3、perror的参数是一个字符串指针,通常是一个描述错误上下文的消息。perror将这个字符串与对应的错误消息(基于errno的值)结合起来,格式通常为<message>: <error message>。

示例

#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *file = fopen("./test.txt", "r");
	if(NULL == file)
	{
		perror("fopen err");
	}
	return 0;
}

编译运行结果
在这里插入图片描述

三、函数strerror

函数作用

strerror函数将错误码转换为相应的错误消息字符串。

头文件

#include <string.h>

函数原型

char *strerror(int errnum);

参数含义

errnum:错误码,通常是全局变量errno的值。

返回值

返回指向描述错误的字符串的指针。

注意点

1、线程安全性:
标准的strerror函数不是线程安全的,因为它返回一个指向静态缓冲区的指针,后续调用可能会覆盖该缓冲区内容。如果在多线程环境中使用,可以考虑使用strerror_r(POSIX.1-2001标准)或者strerror_s(C11标准)函数,它们是线程安全的。

在单线程的程序中,errno是全局变量。然后,在多线程程序中,errno会按照每个线程来储存,因此具有线程安全性。
在多线程程序中,什么情况下使用strerror是绝对安全的了?如果参数errnum是一个已知的errno,则使用strerror是绝对安全的,也就是会返回期待的字符串,而不会出现乱码。

2、返回值:
strerror返回的是一个指向错误消息字符串的指针。不要尝试修改这个字符串,因为它可能是只读的,并且在下次调用strerror时会被覆盖。

3、错误代码范围:
确保传递给strerror的错误码是合法的。传递非法的错误码可能会导致未定义行为。通常,错误码是从头文件errno.h中定义的宏,如EINVAL、ENOMEM等。

示例

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

int main(int argc, char *argv[])
{
    FILE *file = fopen("./test.txt", "r");
    if(NULL == file)
    {
        printf("fopen err: %s\n", strerror(errno));
    }
    return 0;
}

编译运行结果
在这里插入图片描述

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

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

相关文章

SpringCloud Alibaba Seata2.0分布式事务AT模式实践总结

这里我们划分订单、库存与支付三个module来实践Seata的分布式事务。 依赖版本(jdk17)&#xff1a; <spring.boot.version>3.1.7</spring.boot.version> <spring.cloud.version>2022.0.4</spring.cloud.version> <spring.cloud.alibaba.version>…

二种方法轻松提取音频中的钢琴声音

在音乐制作、音频编辑或是纯粹的音乐爱好者的世界里&#xff0c;有时我们需要从复杂的音乐编排中抽取出特定乐器的声音&#xff0c;比如那悠扬的钢琴旋律。这不仅能帮助我们更好地理解音乐的结构&#xff0c;还能在创作过程中提供灵感。本文将介绍两种简单有效的方法&#xff0…

Snipaste截图工具如何控制框线箭头的粗细程度

我们使用Snipaste截图工具的时候&#xff0c;最常用的就是框线和箭头这些功能&#xff0c;有时候感觉很粗有时候感觉太细了&#xff0c;如何解决呢&#xff1f;我们可以在使用框线或者箭头之后&#xff0c;长按1或者2来控制框线箭头的粗细程度。其中1是变细&#xff0c;2是变粗…

.NET C# 树遍历、查询、拷贝与可视化

.NET C# 树遍历、查询、拷贝与可视化 目录 .NET C# 树遍历、查询、拷贝与可视化1 组件安装1.1 NuGet包管理器安装&#xff1a;1.2 控制台安装&#xff1a; 2 接口1.1 ITree\<TTreeNode\>1.2 ITree\<TKey, TTreeNode\>1.3 IObservableTree\<TTreeNode\>1.4 IO…

推荐一本RMS包作者写的我正在追读的书《Regression Modeling Strategies》

熟悉我的粉丝都清楚&#xff0c;我很少推荐书&#xff0c;这次推荐这本书是我目前正在读的&#xff0c;这是本老书了&#xff0c;关于回归模型的&#xff0c;我觉得写的很好。 写这本书的就是RMS包的作者&#xff0c;这是他早些年写的书&#xff0c;我们可以结合他写的书来加深…

2006年上半年软件设计师【上午题】试题及答案

文章目录 2006年上半年软件设计师上午题--试题2006年上半年软件设计师上午题--答案 2006年上半年软件设计师上午题–试题 2006年上半年软件设计师上午题–答案

java启动命令与参数配置

1. java启动命令 运行一个java应用程序的语法分两种&#xff0c;分别为&#xff1a; 执行类&#xff1a;java [-options] class [args…] 执行jar文件&#xff1a;java [-options] -jar jarfile [args…] 其中 [-options] 配置 JVM参数&#xff0c;[args…] 配置 Java 运行参…

牛客链表刷题(四)

目录 一、链表的奇偶重排 代码&#xff1a; 二、删除有序链表中重复的元素-I 代码&#xff1a; 三、删除有序链表中重复的元素-II 代码&#xff1a; 一、链表的奇偶重排 代码&#xff1a; import java.util.*;/** public class ListNode {* int val;* ListNode next nu…

VisualStudio2019受支持的.NET Core

1.VS Studio2019受支持的.NET Core&#xff1f; 适用于 Visual Studio 的 .NET SDK 下载 (microsoft.com) Visual Studio 2019 默认并不直接支持 .NET 6 及以上版本。要使用 .NET 6 或更高版本&#xff0c;你需要在 Visual Studio 2019 中采取额外步骤&#xff0c;比如安装相应…

钢琴灯护眼灯怎么选比较好?五款爆款护眼大路灯推荐

钢琴灯护眼灯怎么选比较好&#xff1f;想要避免孩子在学习时眼睛视力不受影响&#xff0c;除了纠正写作姿势、带出去晒太阳、多看绿色植物舒缓眼睛疲劳之外&#xff0c;剩下的就是光环境问题&#xff0c;毕竟现在的小朋友学业越来越重&#xff0c;大部分时间不是在学校学习就是…

6.20模板

c/c/jave 静态语言强类型语言编译型语言&#xff0c;想要在运行以前就能够找出错误。 python是一个弱类型语言&#xff0c;在运行的时候再确定变量的类型。 背景需求&#xff1a;想要在强类型严格的要求下希望能够更加灵活。 有三种方式可以实现&#xff1a;宏定义&#xff…

各场景ChatGPT指令Promp提示词大全

一、Promp指令使用指南 直接复制Promp指令提示词使用 可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; 支持GPTs应用Prompt自定义预设应用 SparkAi SparkAi创作系统是一款基于ChatGPT和Midjourney开发的智能问答和绘画系统&#xff…

Vue2中为啥不用 Object.defineProperty 实现响应式数组 ? 不能监听到数组变化吗?

Vue2.0 对于数据响应式的实现上是有一些局限性的&#xff0c;比如&#xff1a; 无法检测数组和对象的新增&#xff1b; 无法检测通过索引改变数组的操作&#xff1b; 针对以上问题&#xff0c;我们一般都会把锅甩给 Object.defineProperty。所以&#xff0c;在Vue 3.0 中&am…

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页 超过指定时间未点击滑动 则继续开始滚动 直接上代码 componentSwiper.vue 需要注意页面切换时清除计时器 <template><view><view class"swiperPanel" touchstart"startMove"…

STM32烧写hex及bin文件的五种方法

一.STVP 1.概述 STVP是ST早期的一款下载编程工具&#xff0c;支持早期的ST早期的芯片&#xff08;比如ST7系列&#xff09;&#xff0c;也支持STM8、 STM32。 该工具虽然相对ST-LINK utility、STM32CubeProg比较老&#xff0c;但该工具官方在2017年还进行了维护&#xff0c;现…

基于web的摩托车销售系统的设计与实现-计算机毕业设计源码031706

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对摩托车销售系统等问题&#xff0c;对摩托车…

<sa8650>QCX Usecase 使用详解— Spectra Studio工程建立

<sa8650>QCX Usecase 使用详解— Spectra Studio工程建立 一 前言二 建立usecase工程2.1 前提2.2 创建usecase工程3.2 查看usecase2三 总结一 前言 目前高通平台在camera模块中,我们会使用到usecase这么一个功能模块;本文主要讲解sa8650平台中,通过Spectra Studio 可视化…

[C/C++][VsCode]使用VsCode在Linux上开发和Vscode在线调试

目录 0. 前言1. win10上搭建环境Linux环境2.编写makefile3.怎么在线调试结语 0. 前言 在开发中&#xff0c;可以一边开发一边调试&#xff0c;这样可以大大的减少bug&#xff1b;但是正常来说一个大点的项目&#xff0c;是不太可能单步调试的&#xff0c;因为一般都是用make或…

无人机螺旋桨理论教学培训课程

本文档为一份详细的关于TYTO机器人公司提供的电机和螺旋桨理论及其实验操作的指南。指南首先概述了材料、实验目标以及实验的介绍部分&#xff0c;随后详细阐述了理论问题、实验步骤和附录内容。实验目的在于通过实际测试来测量和理解不同螺旋桨参数对无人机性能的影响&#xf…

手把手教你使用kimi创建流程图【实践篇】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 引言 在昨日的文章中&#xff0c;我们介绍了如何使用Kimi生成论文中的流程图。今天&#xff0c;我们将更进一步&#xff0c;通过实践案例来展示Kimi在生成流程图方面的应用。这不仅将加…