Linux中正确处理errno

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");

你可能感兴趣的:(linux,File,null,include,FP,Descriptor)