附录B 其他源代码

B.1 本书使用的头文件

本书中的大多数程序都包含头文件apue.h,如图 B-1所示。其中定义了常量(如MAXLINE)和我们自编函数的原型。

大多数程序都需要包含下列头文件:<stdio.h>、<stdlib.h>(其中有exit函数原型)和<unistd.h>(其中包含所有标准UNIX函数的原型),因此头文件apue.h 自动包含了这些系统头文件,同时还包含了<string.h>。这样就减少了本书中所有程序的长度。

图B-1 头文件apue.h

程序中先包括 apue.h,然后再包括一般系统头文件,这样就使我们易于做到下列各点:可以先定义一些在此后包括的头文件可能要求的部分;能够控制头文件被包括的顺序;能够重定义某些部分,而这正是为隐藏两个系统之间的差别而需要解决的。

B.2 标准出错例程

我们提供了两套出错函数,用于本书中大多数实例以处理各种出错情况。一套以err_开头,并向标准错误输出一条出错消息。另一套以 log_开头,用于守护进程(见第 13 章),它们多半没有控制终端。

之所以提供我们自己的出错函数,是为了能够编写只有一行C代码的出错处理程序,例如:

if (出错条件)

err_dump(带任意参数的printf格式);

这样就不再需要使用下列代码:

if (出错条件) {

char buf[200];

sprintf(buf, 带任意参数的printf格式);

perror(buf);

abort();

}

我们的出错处理函数使用了 ISO C 的变长参数表功能。其详细说明见 Kernighan 和Ritchie[1988]的7.3节。应当注意的是,这个ISO C功能与早期系统(如SVR3和4.3BSD)提供的varargs功能不同。宏的名字相同,但更改了某些宏的参数。

图B-2列出了各个出错函数之间的区别。

图B-2 标准出错函数

图B-3包括了输出至标准错误的各个出错函数。

图B-3 输出至标准错误的出错函数

图B-4包括了各log_XXX 出错函数。若进程不以守护进程方式运行,那么调用者应当定义变量log_to_stderr,并将其设置为非0值。在这种情况下,出错消息被发送至标准错误。若log_to_stderr标志为0,则使用syslog设施(见13.4节)。

图B-4 用于守护进程的出错函数