http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net
分类: LINUX
2011-09-14 10:44:56
unix程序以下列方式把有意义的错误信息报告给用户:
1)使用perror()函数从errno值生成一条信息并把它报告给stderr;
2)使用所提供的sys_errlist[]数组的信息(在FreeBSD上这是由手册页stderror(3)说明);
3)使用strerror(3)函数返回在函数参数中所提供的错误代码的信息。
perror的使用:
1 #include
2 #include
3
4 int main(int argc, char** argv)
5 {
6 errno=EIO;
7 perror("The EIO messsage");
8 return 0;
9 }
perror函数不能解决的情况:
1)被写入到一个日志文件;
2)报告给x window弹出显示;
3)以不同的格式报告;
4)以串来存储。
syserrlist[]数组的使用:
sys_errlist[]数组是指向串常量的指针的外部数组,每个串说明了对应于errno代码的特定错误,构造这个数组和错误代码,从而通过使用errno值作为数组下标就可以获得错误信息。
sys_errlist[]数组中所提供的最大错误代码是由外部整数值sys_nerr减去1而给出的,为了安全起见,在使用errno值作为下标之前,应该测试errno的值。
#include
2 #include
3 #include
4
5 int main(int argc ,char **argv)
6 {
7 int fd;
8 fd= open("aa1.txt",0400);
9 if (fd == -1)
10 {
11 fprintf(stderr,"%s: opening %s for read\n",(errno < sys_nerr)? sys_errlist[errno]:"?", "aa1.txt");
12 }
13 return 0;
14 }
strerror函数的使用
strerror函数是由sys_errlist[]数组实现的,也要对要转换的错误代码进行必要的范围检查
1 #include
2 #include
3 #include
4
5 int main(int argc,char** argv)
6 {
7
8 int i;
9 static int ecodes[]={-1,EIO,0};
10 ecodes[2]=4096+sys_nerr;
11 for (i=0; i < 3; i++)
12 {
13 errno = ecodes[i];
14 printf("ecodes num %d is %s\n",ecodes[i],strerror(errno));
15 }
16
17 return 0;
18 }
函数ferror();
#include
int ferror(FILE *stream);
void clearerr(FILE * stream);
在参数stream标识的FILE流的某点上出现错误时,函数ferror()返回非零值,这个标识保持为True直到对同一个流调用函数clearerr()。
避免fclose()的缺陷
fwrite(buf, strlen(buf), 1, fptr);
if ( ferror(fptr) ) ) {
/* process write error */
}
if ( fclose(fptr) == EOF ) {
/* errno = ENOSPC */
}
fclose()可能发现在所提供的例子中失败,因为fwrite()写入的数据仍保留在流fptr所提供的缓冲区中,所以这有可能发生。当最后调用fclose()时,在关闭下层文件描述符前,首先是由必要强迫把缓冲区中的未写入数据写到磁盘。