出错处理在UNIX环境中是一个至关重要的环节。当UNIX函数出错时,通常会返回一个负值,并且整型变量errno会被设置为一个特定的值。open函数如果成功执行则返回一个非负文件描述符,但如果出错则返回-1。这时候,errno可能会有大约15种不同的值,例如文件不存在或权限问题。

有趣的是,并不是所有函数都返回负值来表示出错。返回一个指向对象的指针的大多数函数,如果出错则会返回一个null指针。在文件中定义了变量errno以及各种可以赋予它的常数。这些常数都以E开头。若errno等于常数EACCES,这表示产生了权限问题——没有权限打开所请求的文件。

POSIX标准定义了errno为:


extern int errno;

POSIX.1中对errno的定义比C标准中的定义更为严格。C标准允许errno是一个宏,它可以扩展为可修改的整型左值(lvalue)。有两条规则需要记住。第一条规则是:如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。第二条规则是:任一函数都不会将errno值设置为0,在中定义的所有常数都不为0。

C标准定义了两个帮助打印出错信息的函数:


#include <string.h>

char *strerror(int errnum); // 返回:指向消息字符串的指针

</string.h>

此函数将errnum(它通常就是errno值)映射为一个出错信息字符串,并且返回此字符串的指针。更多详情可以参考《unix环境变量编程》和《Unix系统编程》。

这些错误处理机制看起来可能有些复杂,但它们为程序员提供了极大的便利和灵活性。当你在编写涉及文件操作的程序时,如果遇到文件无法打开的问题,你可以通过检查errno来确定具体原因,并据此做出相应处理。这样不仅提高了程序的健壮性,也使得调试过程更加直观和有效。

在《UNIX系统网络编程》中,你可以找到更多关于错误处理的高级技巧和实例。《UNIX编程环境》也是一个极好的资源,它提供了许多实用的示例和详细的解释,帮助你更好地理解和应用这些概念。