GNU编程错误出理

错误报告(Error Reporting)

 

      这一节将要说明错误报告机制是如何工作的。如果你的程序要用此功能,必须包含头文件”errno.h”

 

检测错误

     大多数库函数返回一个特殊的值来指示它们执行中的错误。这个特殊的值一般是-1、空指针(null)、或者像EOF等有明确定义意义的常值。但是这些返回值只是告诉你有一个错误发生,为了找出是什么错误发生,这时就需要查看在变量errno中的值。变量errno定义在头文件”errno.h”中。

 

变量:volatile int errno

变量errno包含了系统错误的代号,你可以修改这个变量的值。

因为errno定义时加了修饰volatile,所以可以一个信号处理中异步修改此值。

在程序启动时,errno初始化为0。大多数库函数在当遇到错误时,都会设置errno为某个非零值。对于每个函数都会列出全部错误的条件。当这些函数调用成功时,errno的值将不会改变。因此,当成功调用后,errno的值不必是0,你也不能以errno去判断一个函数调用是否成功。正确的方法是按第每个函数的说明文档来判断。如果调用失败了,你可以检查errno

大多数库函数在调用其它库函数时,如果出现错误,则会将errno设置为一个非零值。当函数返回错误时,我们可以假设这个函数已变量了errno的值。

 

也存在极少数的函数,如sqrtatan,在发生错误时,也返回一个合法的值,同时也会修改errno的值。对于这样的函数,你如何判断是否有错误发生呢。推荐的方法是,在调用函数之前,设置errno为零,然后在调用后再来检测errno的值,如何发生了改变,则说明调用函数出错。

 

所有的错误代号都有一个符号名,这些宏都在”errno.h”中定义。这些宏定义名都以E和一个大写字母或数字开头。

 

所有这个错误代号都是正整数,并且都是互不相同的。因此,你的程序中可以用switch语句。

 

Errno的值没有必要与所有这引宏定义对应。因为有些库函数为了一些别的情况,返回了别的错误代号。

 

相关的错误代码及说明请查看GCC Library的说明

 

错误信息

函数库已经设计了一些函数和变量,当调用库函数发生错误时,来帮助我们程序以通用的格式报告错误信息。函数strerrorperror对每个给定的错误代号返回标准的错误信息。通过变量program_invocation_short_name你可以方便的得到遇到错误的程序名称。

 

函数 char*  strerror (int  errnum)

定义在头文件”string.h”

通过由errnum指定的错误代号返回错误的描叙字符串。

注意:如果你并发的调用strerror,返回的字符串可能被重写。

 

函数 char*  strerror_r(int  errnum, char buf ,size_t n)

定义在头文件”string.h”

函数strerror_r的工作方式与strerror样同,但替代strerror所有线程共享静态缓冲区保存错误信息的方式为将错误信息保存在用户提供的以buf开头,长为n个字节的缓冲区里。

 

缓冲区最大可写n个字节(包括null,所以必须保证缓冲区够大。

 

这个函数将用于多线程的程序。因为strerror函数不能保证由函数strerror返回的信息真的属于当前线程最后一次调用。

 

函数 void perror ( const char * message)

定义在头文件”stdio.h”

此函数在stderr流中打印错误信息。

 

如果参数message是一个空指针或空字符串时,perror就仅在新一行打印与errno对应的错误信息字符串。

 

如果参数message 不是一个空的字符串时,perror将以message作为前缀,和错误信息输出。在message和与errno对应的错误信息字符串之间插入了冒号和空格。

 

 

变量:char*  program_invocation_name

变量:char*  program_invocation_short_name

定义在errno.h文件中

 

program_invocation_name是文件名,包括路径,等同于argv[0]

program_invocation_short_name 是程序名,不包括路径。

 

注意这两个变量属于GNU扩展,需要使用此两个变量,则要在使用源程序的开始定义宏变量 _GNU_SOURCE

 

如程序:

 

 

#define _GNU_SOURCE

 

#include <errno.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main(int agrc,char* argv[])

{

   FILE*  file;

  

   file=fopen(argv[1],"r");

   if( file == NULL )

   {                   

      fprintf(stderr,"/n%s:cannot open:%s,error:%s/n",program_invocation_short_name,argv[1],strerror(errno));

       exit(EXIT_FAILURE);

   }

 

   return 0;

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值