02-系统限制
11.1 系统限制
SUSv3要求,针对其所规范的每个限制,所有实现都必须支持一个最小值。在大多数情况下,会将这些最小值定义为<limits.h>文件中的常量,其命名则冠以字符串POSIX,而且(通常)还包含字符串_MAX,因此,常量命名形如_POSIX_XXX_MAX。
如果应用程序将本身限制在SUSv3对每个限制所要求的最小值之内,那么该程序对符合标准的所有实现都具有可移植性。然而,这一做法阻碍了应用程序去利用特定实现可提供的更高限制。因此,在特定系统上获取限制,通常更为可取的方法是使用<limits.h>文件、sysconf()或pathconf()。
SUSv3将其所定义的各类限制描述为最小值,但命名却使用了字符串_MAX,这可能颇令人疑惑。换一种思路,将此类常量中的每一个都视为对某类资源或特性的上限,且标准要求这些上限都必须拥有一个确定的最小值,这种命名的用意也就不言自明了。 在某些情况下,会为某个限制提供最大值,并且在对这些值的命名中包含字符串_MIN。对于这些常量,道理正好反过来;它们代表了对某些资源的下限,按照标准规定,在符合标准的实现中,该下限不能高于某个值。例如,限制FLT_MIN(1E-37)为某个实现中所能表征的最小浮点数定义了最大值。所有满足标准的实现至少能够表征如此之小的浮点数。
每个限制都有一个名称,与上述最小值的名称相对应,但缺少了_POSIX_前缀。某个实现可以在<limits.h>文件中以该名称定义一个常量,用以表示该实现的相应限制。若已然定义,则该限制值总是至少等同于前述最大值(即XXX_MAX >=_POSIX_XXX_MAX)。
SUSv3将其规定的限制归为3类:运行时恒定值、路径名变量值和运行时可增加值。在下列段落中将描述这些类别并提供一些例子。