X1定义
,那么也可将源文档的第一行配置为:
#define [CD#*2]POSIX[CD#*2]SOURCE 1
另一个功能测试宏是:[CD#*2][CD#*2]STDC[CD#*2][CD#*2],他是由符合ANSI C标
准的编辑
程式自动定义的。这样就允许我们编写ANSI C编辑程式和非ANSI C编辑程式都能编
辑的程式
。例如,在一个头文档可能会是:
# ifdef [CD#*2]STDC[CD#*2]
void *myfunc(const char *,int);
#else
void *myfunc();
#endif
这样就能发挥ANSI C原型功能的长处,要注意在开始和结束处的两个连续的下划线
常常打印
成一个长下划线(如同上面一个样本源代码中相同)。
27〓基本系统数据类型
历史上,某些Unix变量已和某些C数据类型联系在一起,例如,主、次设备号在历
史上存放
在一个16位的短整型中,用8位表示主设备号,另外8位表示次设备号。但是,很多
较大的系
统需要用多于256个值来表示其设备号,于是,就需要有一种不同的技术。(确实,
SVR4用32
位表示设备号:14位用于主设备号,18位用于次设备号)。
头文档<sys/typesh>中定义了某些和实现有关的数据类型,他们被称之为基本系
统数据类
型。有很多这种数据类型定义在其他头文档中。在头文档中这些数据类型都是用C
的typedef
设施来定义的。他们绝大多数都以[CD#*2]t结尾。图28中列出了本书将使用的基
本系统数
据类型。
图28〓基本系统数据类型
用这种方式定义了这些数据类型后,我们在编辑时就不再需要考虑附系统不同而变
的实施细
节,在本书中涉及到这些数据类型处,我们会说明为什么使用他们。
28〓标准之间的冲突
就整体而言,这些不同的标准之间配合得是相当好的。但是我们也很关注他们之间
的差别,
特别是ANSIC标准和POSIX1之间的差别。(因为XPG3是个较尽的正在被修订的标
准,FIPS
则是个需要更严的POSIX1。)
ANSI C定义了函数clock,他返回进程使用的CPU时间量,返回值是clock[CD#*2]t
类型值。
为了将此值变换成以秒为单位,将其除以在<timeh>头文档中定义的CLOCKS[CD#
*2]PER[CD
#
*2]SEC。POSIX1定义了函数times,他返回其调用者及其任何终止子进程的CPU时
间连同时
钟时间,任何这些值都是clock[CD#*2]t类型值。IEEEStd、10031-1988将符号C
LK[CD#*2
]TCK定义为每秒滴答数,上述clock[CD#*2]t值都是以此度量的。而1990 POSIX
1标准中则
说明不再使用,CLK[CD#*2]TCK应当使用sysconf函数来获得每秒滴答数,并将其用
于times
函数的返回值。术语是同一个,每秒滴答数,但ANSI C和POSIX1的定义却不同。
这两个标
准也用同一数据类型(clock[CD#*2]t)来保存这些不同的值,这种差别能够在SVR4
中看到,
其中clock返回微秒数(CLOCK[CD#*2]PER[CD#*2]SEC是一百万),而CLK[CD#*2]TCK
通常是50
,60或100(和CPU类型有关)。
另一个可能产生冲突的区域是:在ANSI C标准说明函数时,ANSI C所说明的函数可
能会没有
考虑到POSIX1的某些需要。有些函数在POSIX环境下可能需要有一个和C环境下不
同的实现
,因为POSIX环境中有多个进程,而C语言环境则很少会考虑宿主操作系统。尽管如
此,很多
POSIX依从的系统为了兼容性的关系也实现ANSI C函数,signal函数就是个例子
。假如我
们在不了解的情况下使用了SVR4所提供的signal函数(希望编写可在ANSI C环境和
较早Unix
系统中运行的可兼容程式),那么他提供了和POSIX1 sigaction函数不同的语义
。在第十
章中我们会对signal函数作更多说明。
29〓摘要
在过去几年中,在Unix不同版本的标准经方面已有了很大进展。本章对三个主要
标准-AN
SI C、POSIX和XPG3-进行了说明,也分析了这些标准对本书主要关注的两个实现:
SVR4和4
3 BSD所产生的影响。这些标准都试图定义一些可能附实现而更改的参数,但是
我们已
看到这些限制是并不完善的。在本书中,我们会涉及任何这些限制和幻常数。
在本书最后的参数书目中,说明了如何订购这些标准的方法。[LM]
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



