一个不该被遗忘的打印接口
我们大多都使用printf来打印一些信息,其它的接口都比较少用。这里介绍一个被我们遗忘的打印输出函数:perror函数。perror函数简介
perror(s)用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数s所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。
在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用某些函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和errno所对应的错误一起输出。
下面通过例子看一下使用printf与使用perror的区别:
(1)使用printf的例子:公众号:嵌入式大杂烩includestdio。hintmain(void){FILEfp;fpfopen(homebooktestfile,r);if(NULLfp){printf(fopenerror!);}return0;}
此时,我们本地的homebook路径下并没有testfile文件,编译运行就会输出错误信息:(2)使用perror的例子:公众号:嵌入式大杂烩includestdio。hincludeerrno。hincludestring。hintmain(void){FILEfp;fpfopen(homebooktestfile,r);if(NULLfp){perror(fopenerror);}return0;}
同上,编译运行。此时会输出错误信息:
可以看到,使用perror能多输出点详细信息。
前面说了,错误原因依照全局变量errno中。换句话说就是一些全局变量errno保存的就是一些错误代码。我们可以看到在一些比较系统的代码工程中,常常会设计一些错误代码,方便统一管理。
在Linux内核(我这里的内核版本是4。9。88)中,这些系统错误代码在文件includeuapiasmgenericerrnobase。h及includeuapiasmgenericerrno。h中:
这些错误代码后面有一些描述注释,这些描述也不仅仅是作为注释使用,也有与这些错误代码建立一一对应的字符串输出关系,比如:
所以才有了上例的Nosuchfileordirectory的输出。
除此之外,我们也可以不去阅读代码,而是通过errno工具来查询这些错误代码及描述。
我们可以输入errno命令看看有没有errno工具,如果没有,则会提示安装:
使用errnol命令查看系统错误代码及描述:
以上就是本次的分享,如有错误,欢迎指出!谢谢
1024G嵌入式资源大放送!包括但不限于CC、单片机、Linux等。私信回复1024,即可免费获取!