一个不该被遗忘的打印输出函数
我们大多都使用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文件,编译运行就会输出错误信息:
(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;
}
同上,编译运行。此时会输出错误信息:
可以看到,使用perror能多输出点详细信息。
前面说了,错误原因依照全局变量errno中。换句话说就是一些全局变量errno保存的就是一些错误代码。我们可以看到在一些比较系统的代码/工程中,常常会设计一些错误代码,方便统一管理。
在Linux内核(我这里的内核版本是4.9.88)中,这些系统错误代码在文件 include/uapi/asm-generic/errno-base.h
及 include/uapi/asm-generic/errno.h
中:
这些错误代码后面有一些描述注释,这些描述也不仅仅是作为注释使用,也有与这些错误代码建立一一对应的字符串输出关系,比如:
所以才有了上例的No such file or directory
的输出。
除此之外,我们也可以不去阅读代码,而是通过 errno
工具来查询这些错误代码及描述。
我们可以输入errno
命令看看有没有errno工具,如果没有,则会提示安装:
使用errno -l
命令查看系统错误代码及描述:
以上就是本次的分享,如有错误,欢迎指出!谢谢