错误:UNIX程序中的错误代码.doc

错误:UNIX 程序中的错误代码 使用标准错误机制进行处理 级别: 中级 Chris Herborth (chrish@), 自由撰稿人, 作者 学习 errno 全局变量,从而获得更多您想了解的有关 UNIX 标准错误报告机制的知识。您还将了解两个关联的全局变量(sys_nerr 和 sys_errlist),并了解有助于向用户报告错误的标准函数。 引言 UNIX? 开发人员常常忽视进行适当的错误检测和恢复。缺乏 C 语言的异常和标准 C 库的基本错误机制确实会导致出现此种情况。通过本文,您将熟悉标准 C 库中的 UNIX 错误报告,并且有望以用户友好的方式报告和处理错误。 现在就开始学习本文吧! 开始之前 如果想随同本文一起学习代码示例,将需要下载源代码存档(除非您想亲自键入它)。我将使用 C/C++ Development Tooling (CDT) 在 Eclipse 中进行处理。如果您以前未曾使用过 Eclipse,则可转到参考资料部分中的链接,它们有助于您了解 Eclipse 的入门知识。 代码示例是相当琐碎的,但使用诸如 Eclipse 之类的集成开发环境 (IDE) 可使打开系统头文件、查找特定符号等操作变得更容易。Eclipse (3.2) 的最新版本和 CDT 插件 (2.0) 包含了很有帮助的强大功能。 C 程序中的错误报告 C 语言是 UNIX 平台上最常用的编程语言。尽管其他语言在 UNIX 上很普及(如 Java?、C++、Python 或 Perl),但系统的所有应用程序编程接口(Application Programming Interface,API)均已为 C 语言而创建。标准 C 库(每个 C 编译器套件的一部分)是设立诸如可移植操作系统接口(Portable Operating System Interface,POSIX)和 Single UNIX Specification 之类的 UNIX 标准的基础。 20 世纪 70 年代早期开发 C 和 UNIX 时,在发生某一条件时中断应用程序流的异常还是相当新或尚不存在的概念。库只得使用其他约定来报告错误。 当钻研 C 库或几乎任何其他 UNIX 库时,您将会发现报告故障的两种常用方法: 函数返回错误代码或成功代码;如果是错误代码,则代码本身可用于指出何处出错。 函数返回特定值(或值范围)以指明错误,且设置全局变量 errno 以指明问题的起因。 errno 全局变量(或者,更准确地说应为“符号”,因为在具有线程安全的 C 库的系统上,errno 实际上是一个可确保每个线程都具有其各自的 errno 的函数或宏)在 errno.h 系统头文件中定义,并且其所有的可能值都定义为标准常量。 第一个类别中的许多函数实际上会返回标准 errno 代码中的一个,但是,如果不检查手册页上的“返回”部分,则无法预知函数的行为方式。如果运气好的话,函数的手册页会列出其可能返回的所有值,以及它们在此特定函数的上下文中所指的含义。第三方库通常具有单个约定,该库中的所有函数都会遵循此约定,但是,在做出任何假定之前,您将必须再次检查该库的文档。 让我们快速地了解一些代码演示 errno 的情况,并了解可用于将错误代码转换成可读性更强的内容的几个函数。 报告故障 在清单 1 中,您将看到一个简短程序,该程序尝试打开一个不太可能存在的文件,并使用两种不同的方法向运行该程序的用户报告错误。 清单 1. errno 变量记录故障 // errno for fun and profit #include stdio.h #include fcntl.h #include stdlib.h #include errno.h #include string.h const char *FILE_NAME = /tmp/this_file_does_not_exist.yarly; int main( int argc, char **argv ) { int fd = 0; printf( Opening %s...\n, FILE_NAME ); fd = open( FILE_NAME, O_RDONLY, 0644 ); if( fd 0 ) { // Error, as expected. perror( Error opening file ); printf( Error opening file: %s\n, strerror( errno ) ); } return EXIT_SUCCESS; } 运行此程序

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档