<>博客简介: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;
}
编译运行结果