系统限制
Unix 系统定义了很多幻数和常量,有些已被硬编码进程序中,有些要用特定的技术。
1. 限制分类
两种类型的限制是必须的:
(1) 编译时限制(如短整形最大值多少):可以在头文件中定义,程序在编译时可以包含这些头文件。在一个给定系统中不会改变。
(2) 运行时限制(如文件名多少字符):要求进程调用一个函数来获取。在一个给定系统中可能会改变,例如:unix支持多文件系统,不同文件系统所支持的文件名长度可 能不同,属于运行是限制。
注:某些限制在给定的实现中可能是固定的(可以静态的在一个文件中定义),在另一个实现中可能是变化的(需要一个运行时函数调用)。例如:文件名最大字符数,在不同的系统可能不一样,属于运行时限制。
提供了一下三种限制解决问题:
(1) 编译时限制(头文件)
(2) 不与文件或目录相关联的运行时限制(sysconfig函数)。
(3) 与文件或目录相关联的运行时限制(pathconfig和fpathconig)。
如果一个特定的运行时限制在一个给定的系统上不改变,可以定义在一个头文件中。但是若头文件中没有定义则需要调用conf函数中一个。
2. ISO C限制
ISO C限制都是编译时限制。
<limits.h>定义了C标准限制,这些常量都在头文件中,在一个给定系统中不会改变。
<float.h>定义了一组浮点类型常量。
<stdio.h>: FOPEN_MAX:具体实现保证可同时打开的标准I/O流最小数,最小值8。POSIX.1中STREAM_MAX(若定义)必须与FOPEN_MAX相同值。
TMP_MAX:由tmpname函数产生的唯一文件名最大值。
3. Posix 限制
POSIX.1定义了涉及操作系统实现限制的常量。
与接口相关的部分限制与常量分5类:
(1)<limits.h> 不变最小值,共19个常量,_POSIX_开头.
(2)不变值:SSIZE_MAX;
(3)运行时可以增加的值
(4)运行时不变的值(可能不确定)
(5)路径名可变值(可能不确定)
总共44个限制和常量,一些定义在<limits.h>,其余按具体条件可定义或不定义。
19个不变最小值是不变的,它们不随系统而改变,而且是最小值(注:这些不变最小值在一些实际应用中太小)。
不变最小值去掉前缀_POSIX_是实现值,这些实现值不能确保都定义在<limits.h>中,某个特定值可能不再其中,理由:一个给定进程的实际值可能依赖于系统的存储总量。若没有在头文件中定义,则不能在编译时作为数组边界。可以使用sysconf.pathconf,fpathconfig在运行时获取实际值。
可能不确定(逻辑上无上限):该值没有实现上限。
4. XSI限制
(1)不变最小值:10个常量。
(2)数值限制:LONG_BIT和WORD_BIT;
(3) 运行时不变值(可能不确定):ATEXIT_MAX, IOV_MAX和PAGE_SIZE.
5. 获取运行时限制
#include<unistd.h>
long sysconf(int name);
long pathconf(const char *pathname, int name) ;路径名
long fpathconf(int filedes, int name); 文件描述符
所有函数返回值:成功返回相应值,出错-1
_SC_开头常量:sysconf参数name。
_PC_开头常量:pathconf或fpathconf参数name。
注:(1)name不是合适常量,返回-1,errno=EINVAL;
(2)有些name可以改变返回的变量值(>=0),或者返回-1:表示该值不确定。不改变errno。
(3)_SC_CLK_TCK返回值每秒时钟滴答数,用于times函数。