当UNIX函数出现错误时,常常返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值。例如,open函数如果成功执行则返回一个非负文件描述符,如出错则返回-1.在open出错时,有大约15种不同的errno值(文件不存在、权限问题等)。某些函数并不返回负值而是使用另一种约定。例如,返回一个指向对象指针的大多数函数,在出错时,将返回一个NULL指针。
文件<errno.h>中定义了符号errno以及可以赋予的各个常量,这些常量都以字符E开头。例如,若errno等于常量EACESS,这表示产生了权限问题(例如,没有打开所要求文件的足够权限)。
POSIX和ISO C将errno定义为这一一个符号,它扩展成为一个可以修改的整型左值。这可以是包含出错编号的一个整数,或是一个返回出错编号指针的函数。以前使用的定义是:
extern int errno;
但是在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于自己的局部errno以避免一个线程干扰另一个线程。
对于errno应当知道两条规则 。第一条规则:如果没有出错,则其值不会被一个例程清除。因此,仅当函数返回指明出错时,才检验其值。第二条:任何一个函数都不会将errno值设置为0,在<errno.h>中定义的所有常量都不为0。
C标准定义了两个函数,它们帮助打印出错信息。
此函数将errnum(它通常就是errno值)映射到一个出错信息字符串,并且返回此字符串的指针。
perror函数基于errno的当前值,在标准错误上产生一条出错信息,
它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。
出错恢复
可与将<errno.h>中定义的各种出错分出致命性的和非致命性的两类。对于致命性的错误,无法执行恢复动作,最多只能在用户屏幕上打印一条出错信息,或者将一条出错信息写到日志文件中,然后终止。而对于非致命性错误,有课可以较为妥善的处理。大多数非致命性错误在本质上是暂时的,例如资源短缺,当系统中活动较少时,这种出错很可能就不会发生。
与资源相关的非致命性错误包括EAGAIN、ENFILE、ENOBUFS、ENOLCK等,当EBUSY指明共享资源正在使用时,也可以将其作为非致命性错误处理。
文件<errno.h>中定义了符号errno以及可以赋予的各个常量,这些常量都以字符E开头。例如,若errno等于常量EACESS,这表示产生了权限问题(例如,没有打开所要求文件的足够权限)。
POSIX和ISO C将errno定义为这一一个符号,它扩展成为一个可以修改的整型左值。这可以是包含出错编号的一个整数,或是一个返回出错编号指针的函数。以前使用的定义是:
extern int errno;
但是在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于自己的局部errno以避免一个线程干扰另一个线程。
对于errno应当知道两条规则 。第一条规则:如果没有出错,则其值不会被一个例程清除。因此,仅当函数返回指明出错时,才检验其值。第二条:任何一个函数都不会将errno值设置为0,在<errno.h>中定义的所有常量都不为0。
C标准定义了两个函数,它们帮助打印出错信息。
#include <string.h>
char *strerror(int errnum);
此函数将errnum(它通常就是errno值)映射到一个出错信息字符串,并且返回此字符串的指针。
perror函数基于errno的当前值,在标准错误上产生一条出错信息,
#include <stdio.h>
void perror(const char *msg);
它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。
出错恢复
可与将<errno.h>中定义的各种出错分出致命性的和非致命性的两类。对于致命性的错误,无法执行恢复动作,最多只能在用户屏幕上打印一条出错信息,或者将一条出错信息写到日志文件中,然后终止。而对于非致命性错误,有课可以较为妥善的处理。大多数非致命性错误在本质上是暂时的,例如资源短缺,当系统中活动较少时,这种出错很可能就不会发生。
与资源相关的非致命性错误包括EAGAIN、ENFILE、ENOBUFS、ENOLCK等,当EBUSY指明共享资源正在使用时,也可以将其作为非致命性错误处理。
对于资源相关的非致命性错误,一般恢复动作是延迟一些时间,然后再进行尝试。这种技术可以应用于其他情况。例如,当一个出错表明网络连接不再起作用,那么应用程序可以在短时间延迟后重建该连接,某些应用使用指数补偿算法,在每次重复中等待更多的时间。
—————————————————————————————————
本文原创自Slience的csdn技术博客。
本博客所有原创文章请以链接形式注明出处。
欢迎关注本技术博客,本博客的文章会不定期更新。
大多数人想要改造这个世界,但却罕有人想改造自己。
世上没有绝望的处境,只有对处境绝望的人。
————By slience
—————————————————————————————————