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


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

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

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

一、前言

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;
}

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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值