系统错误信息
我们在写程序的时候需要调用C语言提供的库函数,并通过函数的返回值判断嗲用是否成功。其实在C语言中,还有一个全局变量errno,存放了函数调用过程中产生的错误代码。
为防止和长长的返回值混淆,库函数的调用一般并不直接返回错误码,而是将错误码存入名为errno的全局变量中,errno不同数值所代表的错误信心定义在<errno.h>中。如果库函数调用失败,可以通过独处errno的值来确定问题所在,推测程序出错的原因,这也是调试程序的一个重要方法。
配合strerror和perror两个库函数,还可以更方便的查看错误消息。
strerror在<string.h>中声明,用于获取错误码对应的消息描述。
perror在,stdio.h>中声明,用于在屏幕上最近一次系统错误码及其消息描述。在实际开发中,我们写的程序运行于后台,在屏幕上显示错误信息没有意义。
strerror库函数
函数声明:
char *strerror(int errno);
/*函数说明:strerror()用来依参数errno的错误代码来查询错误原因的描述字符串,然后将该字符串指针放回*/
使用方法:
#include<string.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
int main()
{
if(remove("/home/zunnajim.txt")!=0)
{
printf("errno=%d\nstrerror=%s\n",errno,strerror(errno));
}
}
运行结果:
errno=2
strerror=No such file or directory
errno的细节:
1.调用库函数不一定会设置errno
如果调用库函数失败,库函数会设置errno的值,但是并不是全部的库函数在调用失败时都会设置errno的值。
那么如何来查看函数是否设置了errno的值呢?在Linux终端中输入man 函数名称,在出现的信息当中,如果有以下文字说明,那么该库函数就是有设置errno的值。
Upon successful completion fopen(), fdopen() and freopen() return a FILE pointer. Otherwise, NULL is returned and errno is set to
indicate the error.
2.errno不能作为库函数调用失败的标志
在C语言中,如果库函数被正确的执行,errno的值不会清空。换句话说,errno的值只有在一个库函数发生错误的时候才会被设置。当库函数调用正确时,errno的值不会被修改,当然也不会主动设置为0.正因为如此,在实际编程中,判断函数是否成功还得看函数的返回值,只有在函数的返回值失败的情况下,才需要关注errno的值。