Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736547
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-27 17:28:15

当UNIX系统函数出错时,经常会返回一个负数,同时我们一般能根据一个整型数errno的值得到更多的信息。比如,函数open成功后会返回一个非负 数,否则返回-1。open可能的错误大约有15种,比如文件不存在、权限问题等等。有些函数使用一些协定,而不是返回负值。比如,多数函数成功时返回一 个有效指针,否则返回一个null指针。


文件定义了errno,以及errno各种可能的常数值。所有的常数都以字母E开头,比如EACCES表示权限问题。


POSIX和ISO C都把errno定义成一个可修改的整型左值。它既可以是一个错误号(error number),也可以是一个指向错误号的指针。早期的定义为extern int errno;,在多线程环境,errno被定义为:
extern int *__errno_location(void);
#define errno (*__errno_location())


关于errno有两条规则:一、如果没有错误发生,errno的数值不会被清零,所以我们应该只有在函数发生错误的时候才去检查这个值;二、errno的值永远都不可能是0,而且没有一个值为0的错误常数。


有两个打印错误信息的函数:
char *strerror(int errnum)():把错误号翻译成可读信息;
void perror(const char *msg)():根据当前errno的信打印如下格式的错误信息:msg: <错误信息>。


错误恢复(Error Recovery)

定义在里的错误可以分成两类:致命的(fatal)和非致命的。致命错误无法恢复,能做的最多只有在屏幕或日志里输出错误 信息,然后退出。非致命错误有时可以被得到更健壮的处理。多数非致命错误一般是暂时性的,比如资源紧缺,当系统任务更少时可能就不再发生。资源相关 (resource-related)的非致命错误包括EAGAIN、ENFILE、ENOBUFS、ENLCK、ENOSPC、ENOSR、 EWOULDBLOCK,有时也包括ENOMEM。有时候当EBUSY表示一个共享资源正在被使用的时候,也可以被视为非致命错误。有时候当EINTR中 断一个慢的系统调用时也可以视为非致命错误。


典型的资源相关的非致命错误的恢复操作是等待一段时间再进行尝试。这种技术还可以应用在别的场景,比如网络连接错误时,等待后再尝试可能可以重新建立网络 连接。一些应用程序使用指数退避算法(exponential backoff algorithm),每次尝试都会等待更长一段时间。


一个错误是否能恢复,最终还是取决于应用程序的开发人员,如果有一个合理的恢复方法,我们可以避免退出程序来提高程序的健壮性。


阅读(744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~