unix系统实现定义了很多幻数和常量,其中有很多已被硬编码到程序中,或用特定的技术确定。由于大量标准化工作的努力,已有若干种可移植的方法用以确定这些幻数和具体的实现定义的限制。这非常有助于改善unix环境下的软件的可移植性。
以下两种类型的限制是必须的:
(1)编译时限制(eg:短整型的最大值是什么?)
(2)运行时限制(eg:文件名有多少个字符?)
编译时限制可在头文件中定义。程序在编译时可以包含头文件。但是,运行时限制则要求进程调用一个函数获得限制值。
另外,某些限制在一个给定的实现中可能是固定的,而在另一个实现中则可能是变动的。这种类型限制的一个例子是文件名的最大字符限制。目前,大多数unix系统支持多文件系统,而每一种类型都有它自己的限制。文件名的最大长度依赖于该文件处在何种文件系统,例如:根文件系统中的文件名长度限制可能是14个字符,而在另一个文件系统中文件名长度限制可能是255个字符,这是运行时限制的一个例子。
为了解决这个问题,提供了以下3中限制。
(1)编译时限制(头文件)。
(2)与文件或目录无关的运行时限制(sysconf函数)。
(3)与文件或目录有关的运行时限制(pathconf和fpathconf函数)
使事情变得更加复杂的是,如果一个特定的运行时限制在一个给定的系统上并不改变,则可以将其静态地定义在一个头文件中,但是,如果没有将其定义在头文件中,应用程序就必须调用3个conf函数中的一个,以确定其运行时的值。
1、ISO C限制
ISO C定义的所有编译时限制都列在头文件<limits.h>中(如下)。这些限制常量在一个给定的系统中并不会改变。表中第三列列出了ISO C标准可接收的最小值。这用于16位整型的系统,用1的补码表示。第四列列出了32位整型Linux系统的值,用2的补码表示。注意,这里没有列出无符号数据类型的最小值,这些值应该都为0。在64位系统中,其long整型的最大值与表中long long整型的最大值相匹配。
虽然ISO C标准规定了整型数据类型可以接受了的最小值,但POSIX.1对C标准进行了扩充。为了符合POSIX.1标准,具体实现必须支持INT_MAX的最小值为214748647,INT_MIN为-2147483647,UINT_MAX为4294967295。因为POSIX.1要求具体实现支持8位的char类型,所以CHAR_BIT必须是8,SCHAR_MIN必须是-128,SCHAR_MAX必须是255。
还有另一个ISO C常量是FOPEN_MAX,这是具体实现保证可同时打开的标准I/O流的最小个数,该值在头文件<stdio.h>中定义,其最小值是8。POSIX.1中的STREAM_MAX(若定义的话)则应与FOPEN_MAX具有相同的值。
ISO C还在<stdio.h>中定义了常量TMP_MAX,这是由tmpnam函数产生的唯一文件名的最大个数。虽然ISO C定义了常量FILENAME_MAX,但我们应该尽量避免使用它,因为POSI.1提供了更好的替代常量(NAME_MAX和PATH_MAX)。
POISX限制
POISX.1定义了很多涉及操作系统实现限制的常量,遗憾的是,这是POSIX.1中最令人迷惑不解的部分之一。虽然POISX.1定义了大量限制和常量,我们只关心POISX.1接口有关的部分。这些限制和常量分成下列7类:
(1)数值限制:LONG_BIN、SSIZE_MAX和WORD_BIN。
(2)最小值:25个宏定义常量
(3)最大值:_POSIX_CLOCKRES_MIN
(4)运行时可以增加的值:CHARCLASS_NAME_MAX、COLL_WEIGHTS_MAX、LINE_MAX、NGROUPS_MAX和RE_DUP_MAX
(5)运行时不变值(也可能不确定):17个宏定义常量
(6)其他不变值:NL_ARGMAX、NL_MSGMAX、NL_SETMAX和NL_TEXTMAX
(7)路径名可变值:FILESIZEBITS、LINK_MAX、MAX_CANON、MAX_INPUT、NAME_MAX、PATH_MAX、PIPE_MAX和SYMALINK_MAX
这些限制和常量中,某些可能定义在<limits.h>中,其余的则按具体条件可定义和不可定义。25个最小值是不变的(它们不随系统而改变)。它们指定了一些特征最具约束性的值。一个符合POSIX.1的实现应当提供至少这样大的值。这就是为什么将它们称为最小值,虽然它们的名字都包含了MAX。另外,为了保证可移植性,一个严格符合POSIX标准的应用程序不应要求更大的值。
一个严格符合POSIX的应用区别于一个刚刚符合POSIX的应用。符合POSIX的应用只是用在IEEE1003.1-2001中定义的接口。严格符合POSIX的应用满足更多的限制,例如,不依赖POSIX未定义的行为、不使用其他任何已弃用的接口以及不要求所使用的常量大于宏定义的最小值。
3、XSI限制
XSI定义了代表实现限制的几个常量。
(1)最小值:5个宏定义常量,如下图
(2)运行时不变值(可能不确定):IOV_MAX和PAGE_SIZE
表中列出了最小值。最后两个常量值说明了POSIX.1最小值太小的情况,根据推测这个能使考虑到了嵌入式POSIX.1的实现。为此,Single UNIX Specification为符合XSI的系统增加了具有较大最小值的符号。