当UNIX系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。
文件<errno.h>中定义了errno以及可以赋予它的各种常量。
在支持多线程的环境中,多个线程共享进程地址空间,每个线程都有属于他自己的局部errno以避免一个线程干扰另一个线程。
对于errno应当注意两条规则。第一条规则:如果没有出错,其值不会被例程清除。因此,仅当函数的 返回值知名出错时,才检验其值。第二条规则是:任何函数都不会将errno值设置为0,而且在<errno.h>中定义的所有常量都不为0。
C标准定义的两个用户打印出错信息的函数
头文件 | 函数 |
---|---|
#include <string.h> | char * strerror(int errnum) |
strerror函数将errnum(通常就是errno值)映射为一个出错消息字符串,并且返回此字符串的指针。
perror函数基于errno的当前值,在标准错误上产生一条出错消息,然后返回
头文件 | 函数 |
---|---|
#include <stdio.h> | void perror(const char *msg); |
它首先输出由msg指向msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错消息,最后是一个换行符。
出错恢复
可将在<errno.h》中定义的各种出错分成两类:致命性的和非致命性的。对于致命性的错误,无法执行恢复动作。最多能做的是在与欧诺个户屏幕上打印出一条出错消息或者将一条出错消息写入日志文件中,然后退出。对于非致命性的出错,有事可以比较妥善的进行处理。大多数非致命性出错是暂时的(如资源短缺),当系统中活动较少时,这种出错很可能不会发生。
对于资源相关的非致命性出错的典型恢复操作是延迟一段时间,然后重试。一些应用使用指数补偿算法,在每次迭代中等待更长时间。