APUE 学习记录 20200619

1.7 出错处理

当UNIX系统函数出错时,通常会返回一个负值。error.h中定义了errno以及可以赋予它的各种常量,这些常量都以字符E开头。

对于errno应当注意两条规则:

  1. 如果没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,才检验其值。
  2. 任何函数都不会将errno值设置为,而且在error.h中定义的所有常量都不为0。

C标准定义了两个函数,用于打印出错信息。

#include 
char *strerror(int errnum);

strerror函数将errnum映射为一个出错消息字符串,并返回此字符串的指针。

#include 
void perror(const char *msg);

perror函数基于error的当前值,在标准错误上产生一条出错信息,然后返回。首先输出msg指向的字符串,然后是一个冒号,一个空格,接着是对应于error值的出错消息,最后是一个换行符。

Page12 实例

#include "apue.h"
#include 

int main(int argc, char *argv[])
{
    fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
    errno = ENOENT;
    perror(argv[0]);
    exit(0);
}

执行时,将打印

EACCES: Permission denied
./main: No such file or directory

出错恢复

可以将errno.h中定义的各种出错分成两类,致命性的和非致命性的。
对于致命性错误,无法执行恢复操作。最多能在屏幕上打印一条出错消息或将一条出错消息写入日志文件,然后退出。
对于非致命性错误,有时可以较妥善地进行处理。大多数非致命性错误是暂时的(如资源短缺),当系统中的的活动较少时,这种错误可能不会发生。
与资源相关的非致命性错误包括:EAGAIN、ENFILE、ENOBUFS、ENOLCK、ENOSPC、EWOULBLOCK,有时ENOMEM也是非致命性错误。当EBUSY指明共享资源正在使用时,也可将ta作为非致命性错误处理。当EINTR终端一个慢速系统调用时,可将它作为非致命性错误处理。
对于资源相关的非致命性错误的典型恢复操作是延迟一段时间,然后重试。

你可能感兴趣的:(linux编程)