出错处理在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编程环境》也是一个极好的资源,它提供了许多实用的示例和详细的解释,帮助你更好地理解和应用这些概念。
暂无评论