分类: 系统运维
2012-03-27 17:28:15
当UNIX系统函数出错时,经常会返回一个负数,同时我们一般能根据一个整型数errno的值得到更多的信息。比如,函数open成功后会返回一个非负
数,否则返回-1。open可能的错误大约有15种,比如文件不存在、权限问题等等。有些函数使用一些协定,而不是返回负值。比如,多数函数成功时返回一
个有效指针,否则返回一个null指针。
文件
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)(
错误恢复(Error Recovery)
定义在
典型的资源相关的非致命错误的恢复操作是等待一段时间再进行尝试。这种技术还可以应用在别的场景,比如网络连接错误时,等待后再尝试可能可以重新建立网络
连接。一些应用程序使用指数退避算法(exponential backoff algorithm),每次尝试都会等待更长一段时间。
一个错误是否能恢复,最终还是取决于应用程序的开发人员,如果有一个合理的恢复方法,我们可以避免退出程序来提高程序的健壮性。