附录C 杂凑的源代码

C.1 unpipc.h头文件

本书正文中几乎每个程序都包含了我们的unpipc.h头文件,它如图C-1所示。该头文件包含了大多数网络程序需要的所有标准系统头文件以及一些普通的系统头文件。它还定义了诸如MAXLINE等常值和我们已在正文中定义过的函数(例如px_ipc_name),以及所用到的所有包裹函数的ANSI C函数原型。不过这儿没有给出这些原型。

图C-1 我们的unpipc.h头文件

图C-1(续)

图C-1(续)

图C-1(续)

C.2 config.h头文件

本书中使用了GN.autoconf工具以辅助所有源代码的移植。它可以从ftp://prep.ai.mit.edu/pub/gnu获取。这个工具生成一个名为configure的shell脚本,在把软件下载到你的系统后你必须运行该脚本。这个脚本确定你的Unix系统所提供的特性:支持Syste.V消息队列吗?定义unit8_t数据类型了吗?提供gethostname函数了吗?等等,最终生成一个名为config.h的头文件。它是上节介绍的unpipc.h头文件中包含的第一个头文件。图C-2给出了在使用gcc编译器的前提下,在Solari.2.6系统上生成的config.h头文件。

其中从第1列开始以#define开头的行代表系统提供了的特性。注释掉并且含有#undef的行代表系统没有提供的特性。

图C-2 Solaris 2.6上的config.h头文件

C.3 标准错误处理函数

我们定义了一组自己的错误处理函数,它们用在整本书中以处理出错情况。定义一组自己的错误处理函数的原因在于,我们可以用一行简单的C代码编写错误处理过程,就像如下所示:

if (出错条件)

err_sys(带任意数目的参数的printf格式串);

而不是如下所示用多行:

if (出错条件)

char buff[200];

snprintf(buff,sizeof(buff),带任意数目的参数的printf格式串);

perror(buff);

exit(1);

}

我们的错误处理函数使用来自ANSI C的可变长度参数表机制。具体细节参见[Kernighan and Ritchie 1988]的7.3节。

图C-3列出了各个错误处理函数之间的差异。如果全局整数daemon_proc非零,那么当前出错消息将按指定的级别传递给syslog(关于syslog的细节参见UNPvl第12章);否则,当前出错消息输出到标准错误输出。

图C-3 标准错误处理函数汇总

图C-4给出了图C-3所示的5个函数。

图C-4 我们的标准错误处理函数

图C-4(续)

图C-4(续)