文件<errno.h>中定义了errno以及可以赋予他的各种常量。这些常量都以字符E开头。另外,UNIX系统手册第2部分的第1页,intro(2)列出了所有这些出错常量。
第一个规则
如果没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,才检验其值。
第二个规则
任何函数都不会将errno值设置为0,而且在<errno.h>中定义的所有常量不为0。
C标准定义了两个函数,他们用于打印出错信息。
#include <string.h>
char *strerror(int errnum);
perror函数基于errno的当前值,在标准错误上产生一个出错消息,然后返回。
#include <stdio.h>
void perror(const char *msg);
#include "apue.h"
#include <errno.h>
int main(int argc,char *argv[])
{
fprintf(stderr,"EACCES: %s\n",strerror(EACCES));
errno=ENOENT;
perror(argv[0]);
exit(0);
}
出错恢复 分为两类:致命性的和非致命性的。对于致命性的错误,无法执行恢复动作。最多能做的是在用户屏幕上打印出一条出错消息或者将一条出错消息写入日志文件中,然后退出。对于非致命性的出错,有时可以较妥善地进行处理。大多数非致命性出错是暂时的(如资源短缺),当系统中的活动较少时,这种出错很可能不会发生。 与资源相关的非致命性出错包括:EAGAIN、ENFILE、ENOBUFS、ENOLCK、ENOSPC、EWOULDBLOCK,有时ENOMEM也是非致命性出错。当EBUSY指明共享资源正在使用时,也可将它作为非致命性出错处理。当EINTR中断一个慢速系统调用时,可将它作为非致命性出错处理。