标准C库函数之perror()、strerror(),以及他们之间各种的优缺点(打印错误信息)

这篇具有很好参考价值的文章主要介绍了标准C库函数之perror()、strerror(),以及他们之间各种的优缺点(打印错误信息)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

如果,想要深入的学习标准C库中perror、strerror函数,还是需要去自己阅读Linux系统中的帮助文档。

具体输入命令:

man 3 perror
man 3 strerror

即可查阅到完整的资料信息。

perror函数

perror函数是C语言标准库中的一个函数,用于在发生系统调用错误时输出有关错误信息的描述。该函数定义在stdio.h头文件中。perror根据传入的参数(通常是一个字符串)生成一个描述性的错误消息,然后将这个消息输出到标准错误流(stderr)。

函数原型如下:

#include <stdio.h> //使用此函数需引入此头文件

void perror(const char *str);

参数:

  • str:一个指向常量字符的指针,用于提供上下文信息。在输出错误消息时,这个字符串将作为错误消息的前缀(也就是说,你可以手动的去描述这个错误是怎么发生的)。

perror的工作原理:当一个系统调用或库函数发生错误时,通常会将全局变量errno设置为一个特定的错误码。perror函数读取errno的值,并根据这个值生成相应的错误描述。然后,将错误描述与传入的字符串参数拼接,并输出到标准错误流。

使用示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file_ptr;

    file_ptr = fopen("non_existent_file.txt", "r");
    if (file_ptr == NULL) {
        perror("Error opening file");
        return 1;
    }

    // ... 其他操作 ...

    fclose(file_ptr);
    return 0;
}

在上面的示例中,当试图打开一个不存在的文件时,fopen函数会返回NULL,并将errno设置为一个特定的错误码。

调用perror函数输出类似于以下内容的错误消息:

Error opening file: No such file or directory

这里的"Error opening file"是传入的字符串参数,而"No such file or directory"是由perror根据errno值生成的描述性错误信息。

strerror 函数

strerror函数是标准C库中的一种函数,它用于生成描述错误代码的字符串。这个函数在string.h头文件中定义。

这个函数的原型是:

#include <string.h> //使用此函数需引入此头文件

char *strerror(int errnum);

参数:

  • 该函数接受一个整数errnum作为参数,这个参数通常是一个错误代码,比如你可能从某些函数(如open或read)中得到这样的错误代码。

返回值:

  • 函数会返回一个指向描述该错误的字符串的指针。这个字符串可以用来打印错误消息,使得用户能够理解发生了什么问题。

例如,你可以这样使用strerror:

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

int main() {
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        printf("打开文件出错: %s\n", strerror(errno));
        return 1;
    }

    // 做一些处理
    fclose(file);
    return 0;
}
  • 在这个例子中,如果文件不存在,fopen会返回NULL,并将errno设置为表示错误的值。然后,我们可以使用strerror来获取并打印描述这个错误的消息。

  • 需要注意的是,strerror返回的字符串是静态分配的,不需要(也不应该)被手动释放。此外,因为strerror返回的是静态数据,所以它不是线程安全的。在多线程环境中,你可能需要使用strerror_r,这个函数有一个额外的参数用于存储结果,可以避免竞态条件。

  • 另外,也应该注意strerror可能不会知道所有可能的错误代码。如果你传递一个它不认识的错误代码,它可能会返回一个消息说这个错误未知。

strerror()函数与perror()函数各种的优缺点

strerror

优点:

  • 灵活性:strerror返回一个字符串,这使得你可以自由地使用这个字符串。例如,你可以将其存储,发送给用户,或者记录到日志中。

  • 自定义错误消息:可以通过与其他字符串拼接,创建定制的错误消息。

缺点:

  • 需要手动处理错误消息:在打印错误消息时,需要手动处理错误消息的格式化和输出。

  • 非线程安全:strerror在多线程环境中可能会产生问题,因为它返回静态内存中的字符串。如果你需要线程安全,需要使用strerror_r版本。

perror

优点:

  • 简单易用:perror在打印错误消息时无需处理错误消息的格式化和输出,使得错误处理代码更加简洁。

  • 自动生成错误消息:它自动地在你提供的自定义消息后添加一个描述错误的消息。

缺点:

  • 不够灵活:perror总是将错误消息输出到标准错误输出。如果你需要将错误消息发送到其他地方,你就无法使用perror。

  • 缺乏自定义:虽然你可以提供自定义消息,但perror控制的消息格式有限。如果你需要更特殊的格式,可能需要使用strerror。

总的来说,选择使用哪一个函数取决于你的需求。如果你需要处理错误消息,例如将其发送到特定的日志系统,或者创建定制的错误消息,那么strerror可能是更好的选择。如果你只需要快速地向用户报告错误,并且默认的格式足够好,那么perror可能是更好的选择。

strerror_r 函数

strerror_r函数是标准C库中的另一种处理错误的函数,它与strerror函数类似,但具有线程安全性。

  • 在标准C库中,strerror_r函数有两个不同的实现POSIX和GNU。它们具有不同的原型和行为,我将分别介绍它们。

POSIX版本的strerror_r

POSIX版本的strerror_r的原型如下:

int strerror_r(int errnum, char *buf, size_t buflen);

这个函数接受三个参数:

  • errnum:错误码。
  • buf:用于存储错误消息的缓冲区。
  • buflen:缓冲区的大小。

返回值

  • 函数的返回值是一个整数,表示操作的成功与否。如果返回值为0,表示成功获取错误消息;如果返回值为正数,表示错误码无效,无法获取错误消息;如果返回值为负数,表示发生了错误。

  • 需要注意的是,POSIX版本的strerror_r函数的行为和strerror函数略有不同。它不返回一个静态字符串指针,而是将错误消息复制到提供的缓冲区中。因此,这个函数是线程安全的,因为它使用了用户提供的缓冲区。

GNU版本的strerror_r

GNU版本的strerror_r的原型如下:

char *strerror_r(int errnum, char *buf, size_t buflen);

这个函数接受三个参数:

  • errnum:错误码。
  • buf:用于存储错误消息的缓冲区。
  • buflen:缓冲区的大小。

返回值

  • 函数的返回值是一个指向错误消息字符串的指针。与strerror函数不同,GNU版本的strerror_r并不返回静态分配的字符串,而是将错误消息复制到提供的缓冲区中,并返回指向缓冲区的指针。

  • 这个版本的strerror_r在多线程环境中是安全的,因为它将错误消息存储在用户提供的缓冲区中,而不是使用静态内存。

  • 需要注意的是,GNU版本的strerror_r与POSIX版本的返回类型和行为不同。在GNU版本中,返回值始终是指向错误消息字符串的指针,不论操作是否成功。

使用哪个版本取决于在编译时使用的特性测试宏。如果定义了 _POSIX_C_SOURCE,则使用 XSI-compliant version,否则使用 GNU-specific version。这也是为什么 strerror_r 函数在不同的系统和设置中可能有不同的行为。

总结

在我们的讨论中,我们涉及了以下内容:

  • strerror函数:它是标准C库中的函数,用于生成描述错误代码的字符串。它接受一个错误码作为参数,并返回一个描述错误的字符串。这个字符串可以用于打印错误消息或其他需要错误描述的场景。

  • perror函数:它也是标准C库中的函数,用于报告错误消息。它会打印你提供的自定义消息,后跟一个冒号、一个空格,然后是描述当前错误的消息。它的优点是简单易用,适用于快速报告错误的场景。

  • strerror_r函数:它是标准C库中的函数,用于获取描述错误代码的字符串,同时具备线程安全性。它有两个不同的实现:POSIX和GNU。POSIX版本将错误消息复制到用户提供的缓冲区中,并返回一个表示操作成功与否的整数。而GNU版本将错误消息复制到用户提供的缓冲区中,并返回指向缓冲区的指针。

总体而言,strerror函数和strerror_r函数用于获取描述错误的字符串,而perror函数用于报告错误消息。选择使用哪个函数取决于你的需求和编程环境,例如需要灵活性、自定义错误消息还是线程安全性。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容文章来源地址https://www.toymoban.com/news/detail-812743.html

到了这里,关于标准C库函数之perror()、strerror(),以及他们之间各种的优缺点(打印错误信息)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 视频编码标准H.264/AVC,H.265/HEVC,VP8/VP9,AV1的基本原理、优缺点以及适用场景

    视频编码标准是用于压缩数字视频数据的技术规范,以减少存储和传输所需的带宽。以下是关于H.264/AVC、H.265/HEVC、VP8/VP9和AV1这些标准的基本原理、优缺点以及适用场景的简要描述: H.264/AVC (Advanced Video Coding) 基本原理 : H.264是一种块导向的运动补偿视频压缩标准。它使用混

    2024年03月16日
    浏览(47)
  • Linux vs windows 他们之间的区别

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录  前言 一.windows与Linux区别 二.Linux与Windows操作对比 三.Linux与Windows命令 1.Linux常用命令 2.Windows常用命令 四.介绍或分享一些

    2024年02月11日
    浏览(26)
  • Agile vs DevOps 他们之间的相似与不同

            敏捷和 DevOps 是当今使用最广泛的两种软件方法,有无数的争论在争论各自的优点。尽管这两种方法似乎有很多共同点,但它们之间也存在一些明显的差异。 敏捷与 DevOps: 历史 要了解敏捷和 DevOps 的方法是如何演变的,让我们从瀑布方法开始。大约在 1950 年代,

    2024年02月08日
    浏览(26)
  • c语言-库函数strstr()、strtok()、strerror()介绍

    本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 strstr()实现的是查找子字符串。 下面是cplusplus网站关于这个库函数的介绍以及使用。 说明: 参数str1:被扫描的字符串 参数str2:需要查找的子字符串 返回值: 返回值不为NULL,说明在str1存在str2,返回str1第一次出现s

    2024年01月17日
    浏览(54)
  • DTO,VO,PO的意义与他们之间的转换

    DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。再通俗一

    2024年02月11日
    浏览(31)
  • 各种程序员岗位,你知道他们都是干什么的吗?

    小伙伴在学习编程的时候 可能还会希望 了解一些互联网行业的相关技术岗位 比如说 前端后台大数据运维测试 算法等等岗位都是干什么的 今天咱们就虚构一个故事 用一个博客系统的开发流程 说一说互联网有哪些程序员岗位 以及程序员工作有衔接的相关岗位 那故事开始我注

    2024年02月03日
    浏览(36)
  • 小程序(uniapp)页面的跳转方式有哪些,他们之间的区别是什么?

    1、uni.navigateTo: 保留当前页面,跳转到应用的某个页面,使用 uni.navigateBack 可以返回原页面。这种方式类似于网页的超链接跳转。 2、uni.redirectTo: 关闭当前页面,跳转大应用内的某个页面。这种方式类似于网页的重定向。 3、uni.switchTab: 跳转到tabBar页面,并关闭其他所有非ta

    2024年02月11日
    浏览(30)
  • 06 为什么需要多线程;多线程的优缺点;程序 进程 线程之间的关系;进程和线程之间的区别

    CPU、内存、IO之间的性能差异巨大 多核心CPU的发展 线程的本质是增加一个可以执行代码工人 多线程的优点 多个执行流,并行执行。(多个工人,干不一样的活) 多线程的缺点 上下文切换慢,切换上下文典型值1us vs 0.3ns/cycle CPU在执行A任务(A没有执行完)时,切换到任务B,需

    2024年02月14日
    浏览(39)
  • 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

    目录 引言 二、线性回归 三、逻辑回归 四、支持向量机 五、决策树

    2024年02月02日
    浏览(34)
  • 大数据面试题:Spark和MapReduce之间的区别?各自优缺点?

    面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答: 1)spark和maprecude的对比;2)mapreduce与spark优劣好处 问过的一些公司:阿里云(2022.10),银联(2022.10),携程(2022.09),vivo(2022.09),滴滴(2022.09)(2020.09),网易云音乐(2022.09),快手(2022.08),字节(20

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包