UNIX系统实现定义了很多幻数和常量,使用限制可以确定这些幻数和具体实现定义的限制。
限制分类:
1.编译时限制(基本类型的最大最小值等):一般在头文件中定义,编译时包含头文件;
2.运行时限制(文件名包含字符数等):要求进程调用一个函数获得限制;
为解决某些限制在一个给定的视线中可能是固定的(静态的在头文件中定义),在另一个实现中可能是变动的(需要有一个运行时函数调用),提供了3种限制:
1.编译时限制(头文件)
2.与文件或目录无关的运行时限制(sysconf)
3.与文件或目录有关的运行时限制(pathconf、fpathconf)
若一个特定的运行时限制限制在一个给定的系统上并不改变,可以静态的定义在一个头文件中;
若未将其定义在头文件中,只能调用3个conf函数中一个,确定运行时的值。
ISO C限制
ISO C定义的所有编译时的限制都列在头文件<limits.h>中
POSIX限制
7类限制:
1. 数值限制:LONG_ BIT、SSIZE_ MAX和WORD_ BIT
2. 最小值:25个常量
3. 最大值:_POSIX_CLOCKRES_MIN
4. 运行时可以增加的值: CHARCLASS_NAME_MAX、COLL_WEIGHTS_MAX、LINE_MAX、NGROUPS_MAX和RE_DUP_MAX
5. 运行时不变值(可能不确定-逻辑上无限,意味着该值没有实际上限)
6. 其他不变值 NL_ARGMAX、NL_MSGMAX、NL_SETMAX、NL_TEXTMAX
7. 路径名可变值:FILESIZEBITS、LINK_MAX、MAX_CANON、MAX_INPUT、NAME_MAX、PATH_MAX、PIPE_BUF和SYMLINK_MAX
POSIX.1提供了3个运行时函数(sysconf、pathconf、fpathconf)以供调用,使用时可以在运行时得到实际的实现值
XSI限制
定义了代表实现限制的几个常量:
1. 最小值:5个常量
2. 运行时不变值(可能不确定):IOV_MAX、PAGE_SIZE
sysconf、pathconf、fpathconf函数
#include < unistd. h>
long sysconf( int name);
long pathconf( const char *pathname, int name);
log fpathconf( int fd, int name);
成功返回相应值,出错返回-1;
不确定的运行时限制
如果有些限制值没有在头文件中定义,在编译时就不可以使用,但是如果他们的值不是确定的,在运行时它们的值也可能未定义。
1.路径名
为路径名动态分配存储区:
若<limits.h>中未定义常量PATH_MAX,需要调用pathconf。pathconf的返回值是基于工作目录的相对路径名的最大长度,将返回值+ 1作为结果值——SUS明确要求在结尾处加一个终止NULL字节
2.最大打开文件数
使用LONG_MAX作为要关闭的文件上限数,会浪费大量时间,并且没有那么多文件打开;因此设置进程能够打开的文件数并设置上限,可以规避风险;
选项
对每个选项,有3种可能的平台支持状态
1. 如果符号常量没有定义或者定义值为-1,那么该平台在编译时并不支持相应选项。
2. 如果符号常量的定义值大于0,那么该平台支持相应选项。
3. 如果符号常量的定义值为0,则必须调用sysconf、pathconf或fpathconf来判断相应选项是否受到支持
常用基本数据类型