errno变量(需include errno.h)会被赋一个整数值,不同的值表示不同的含义,
可以通过查看该值推测出错的原因。但是errno是一个数字,代表的具体含义
还要到errno.h中去阅读宏定义。有下面几种方法可以方便的得到错误信息
(一)
#include <stdio.h>
void perror(const char *s)
perror()用来将上一个函数发生错误的原因输出到stderr。参数s所指的字符串会先
打印出,后面跟一个冒号和一个空格再加上错误原因字符串 后面再加上一个换行符。
此错误原因依照全局变量errno的 直来决定要
输出的字符串
*******/
#include<stdio.h>
#include<stdlib.h>
int main ()
{
FILE *fp;
fp=fopen("/tmp/xx","r+");
if(fp==NULL) perror("fopen");
return 0;
}
(二)
#include <string.h>
char * strerror(int errnum)
函数说明 strerror()用来依参数errnum的错误码来查询错误原因
的描述字符串,然后将该字符串指针返回。
这个函数本身并不会抱错 所以没有为这个函数保留响应的错误值
返回值: 返回描述错误原因的字符串指针
****/
#include <string.h>
#include <stdio.h>
int main ()
{
//显示错误代码0到9的错误原因描述
int i;
for(i=0;i<10;i++)
fprintf(stderr,"%d:%s /n",i,strerror(i));
return 0;
}
strerror函数可能会改变error。如果需要在调用strerror后再次使用
error ,应该在调用strerror钱保存error,并在再次使用之前将其恢复。
下面的代码说明如何在使用strerror的同时依然保持error的值
int error;
int fildes;
if (close(fildes)==-1){
error = errno;
fprintf(stderr,"Failed to close descriptor %d :%s/n",
fildes,strerror(errono);
errno = error;
}
正确地处理errno是个棘手的问题。由于库函数的实现中可能会调用其他可以
设置errno的函数,因此,即使库函数的联机帮助页面中没有显示的说明,库
函数还是会对errno进行修改。同样,应用程序无法修改从strerror中返回的字符串,
但是,对strerror和perror的后继调用可能会重新此写这个字符串。
另一个共性的问题就是当进程被信号中断后,很多库函数调用都会被中止。函数通
常用BINTR的错误码来报告这种类型的返回。例如,close函数可能会被一个中断信号
中断。在这种情况下,错误不是由它执行中造成的,而是由于某些外部因素造成的。通常
程序不应将这种中断当做错误来处理,而是应该重启这个调用。
下面的代码说明在出现信号时重启close函数。
int error;
int fildes;
while (((error = close(fildes))==1)&&(errno == BINTR));
if (error == -1)
perror("Failed to close the file "); //a real close error occrred
while的子句是一个空语句。这段代码只是简单的调用close函数知道执行成功或遇到真正的
错误为止。重启库函数调用的问题非常常见,可以为之定义一个库如restart.h
之中的函数名字的前端加上r_来指示这些函数。例如r_close来指定close的重启版本
#include “restart.h”
int fildes;
if (r_close(fildes) == -1)
perror("Failed to close the file");