当Unix函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为包含出错信息的一个值。
整型变量errno包含在头文件<errno.h>中,该文件中包含了errno的各种取值,这些取值通常以字母E开头(例如:EACCESS表示没有访问权限).
在以前的Unix系统中通常将errno定义为:
extern int errno
但是在引入多线程的概念后,由于多线程共享内存的地址空间,每个线程都应该有属于它自己的局部errno以防止线程之间的干 扰。Linux为了支持多线程存取errno,将其定义为:
extern int *__errno_location()
#define errno (*__errno_location())
对于errno应该知道两条规则:
1. 如果函数没有出错,errno的值就不会被重置,在这种情况下查看errno的值没有意义,所以当且仅当函数调用出错时才去查看errno 的值。
2. 任意函数都不会将errno的值置为0,在<errno.h>中定义的常量都不为0.
为了方便查看错误信息,标准C提供了如下两个函数:
1. char *strerror(int errno)
该函数将错误码errno作为参数,将该错误码表示的详细信息作为字符串返回。
<span style="font-family:'Courier New';color:#33033;"> #include<stdio.h>
#include<string.h>
#include<errno.h>
int
main()
{
FILE *fp;
fp = fopen("/tmp/wahaha","r");
if(!fp)
{
printf("%s\n", strerror(errno));
}
return 0;
}</span>
如果文件/tmp/wahaha不存在,将打印:
No such file or directory
2. void perror(char *message)
perror 封装了错误码errno,将error表示的错误信息重定向到stderr上,其输出格式为:message:errno表示的错误信息.
<span style="font-family:Courier New;font-size:14px;"> #include<stdio.h>
#include<string.h>
#include<error.h>
int
main()
{
FILE *fp;
fp = fopen("/tmp/wahaha","r");
if(!fp)
{
perror("This is a error msg");
}
return 0;
}</span>
如果文件/tmp/wahaha不存在,将打印:
This is a error msg: No such file or directory