1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

我们大多都使用printf来打印一些信息,其它的接口都比较少用。这里介绍一个被我们遗忘的打印输出函数:perror函数

perror函数简介

perror(s) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。

在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和errno所对应的错误一起输出。

下面通过例子看一下使用printf与使用perror的区别:

(1)使用printf的例子:

/* 微信公众号:嵌入式大杂烩 */
#include<stdio.h>

int main(void)
{
    FILE *fp;
    fp = fopen("/home/book/test_file", "r+");
    if (NULL == fp)
    {
        printf("fopen error!\n");
    }
 
    return 0;
}

此时,我们本地的/home/book/路径下并没有test_file文件,编译运行就会输出错误信息:

C语言 | perror函数使用详解_C语言

(2)使用perror的例子:

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

int main(void)
{
    FILE *fp;
    fp = fopen("/home/book/test_file","r+");
    if (NULL == fp)
    {
        perror("fopen error");
    }
    return 0;
}

同上,编译运行。此时会输出错误信息:

C语言 | perror函数使用详解_C语言_02

可以看到,使用perror能多输出点详细信息。

前面说了,错误原因依照全局变量errno中。换句话说就是一些全局变量errno保存的就是一些错误代码。我们可以看到在一些比较系统的代码/工程中,常常会设计一些错误代码,方便统一管理。

在Linux内核(我这里的内核版本是4.9.88)中,这些系统错误代码在文件 include/uapi/asm-generic/errno-base.hinclude/uapi/asm-generic/errno.h 中:

C语言 | perror函数使用详解_C语言_03

C语言 | perror函数使用详解_C语言_04

这些错误代码后面有一些描述注释,这些描述也不仅仅是作为注释使用,也有与这些错误代码建立一一对应的字符串输出关系,比如:

C语言 | perror函数使用详解_C语言_05

所以才有了上例的No such file or directory的输出。

除此之外,我们也可以不去阅读代码,而是通过 errno 工具来查询这些错误代码及描述。

我们可以输入errno命令看看有没有errno工具,如果没有,则会提示安装:

C语言 | perror函数使用详解_编程开发_06

使用errno -l命令查看系统错误代码及描述:

C语言 | perror函数使用详解_编程开发_07

以上就是本次的分享,如有错误,欢迎指出!谢谢


猜你喜欢

从串口驱动到Linux驱动模型

串口打印知多少?

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!