UNIX系统实现定义了很多幻数和常量,很多已经被硬编码到程序中,或用特定的技术确定了。
以下两种类型的限制是必需的:
1.编译时限制(例如,短整型的最大值是什么?)
2.运行时限制(例如,文件名可以有多少个字符)
某些限制在一个给定的实现中可能是固定(因此可以静态地在一个头文件中定义),而在另一个实现上则可能是变化的(需要有一个运行时函数调用)
为了解决这样的限制问题,提供了一下三种方式:
1.编译时限制(头文件)
2.不与文件或目录相关联的运行时限制(sysconf函数)
3.与文件或目录相关联的运行时限制(pathconf和fpathconf函数)
sysconf- 运行时获取系统配置信息
摘要
#include<unistd.h>
longsysconf(int name);
描述
POSIX允许一个应用程序在编译和运行时测试某个选项或参数是否被支持,或是这个值在某些配 置下是固定不变的(即可配置的)或是有限制的
在编译时,这样的限制通过包含<unistd.h>and/or <limits.h>头文件
并且测试某一个宏的值
在运行时,任何人可以通过使用已有的sysconf()函数获得一个数值量(long型值).任何人也可以通过fpathconf(3)和pathconf(3)函数返回与系统中文件和
目录相关的这样的参数.任何人也可以通过confstr(3)返回字符串型的值.
从这几个函数获得的这些值是系统配置的一些常量. 通常他们在进程的生存期内不发生改变(在apue的P41页有更多的阐述).
所有选项中,类似_POSIX_FOO的常量通常可能定义在<unistd.h>. 如果它并未被定义,我们应当在运行时尝试获取、调用.
如果选项值被定义为-1,那么此选项值并不被支持.
如果选项值被定义为0,那么相关的函数和头文件是存在的,但是我们通常在运行时获得它所被支持或是限制的程度(为某个数值)究竟是多少.
如果选项值被定义为其他的值,那么这个选项是被支持的.
通常这个值(例如200112L)指示POSIX版本描述这个选项的年、月
标准C使用1来指示还没有在POSIX标准被发布的却已支持的选项.
sysconf()函数的参数形如 _SC_FOO. 选项的列表可以详见man手册页中的posixoptions(7).(将在后文给出)
对于一些数值或是限制,通常有一个 类似 _FOO常量,可能是在 <limits.h>中定义了,或是类似 _POSIX_FOO,则可能被定义在<unistd.h>头文件中.
如果某个限制没有每定义或指出那么相应就不会有常量被申明定义.如果某个常量被定义,它提供了一个保障性的值,可能更大的数值也能得到支持.
如果一个程序希望利用各个系统之间数值的不同带来的好处、优势,便可以调用sysconf()函数.
sysconf()的参数形如_SC_FOO.
POSIX.1Variables
我们列出变量的名称,和sysconf()调用该变量时用到的参数的名称并为其附上简短的说明.
-------首先是POSIX.1兼容的选项值.
ARG_MAX- _SC_ARG_MAX
exec函数的参数最大长度. 长度最短不小于 _POSIX_ARG_MAX(4096).
CHILD_MAX- _SC_CHILD_MAX
每个实际用户ID的最大进程数. 至少为 _POSIX_CHILD_MAX(25).
HOST_NAME_MAX- _SC_HOST_NAME_MAX
gethostname函数返回的主机名最大长度. 长度至少为 _POSIX_HOST_NAME_MAX(255).
LOGIN_NAME_MAX- _SC_LOGIN_NAME_MAX
登录名的最大长度,包括终止的空字符.不得小于 _POSIX_LOGIN_NAME_MAX(9).
clockticks - _SC_CLK_TCK
每秒钟时钟滴答数. 同样可以称为 CLK_TCK.
(Note:数量更大的 CLOCKS_PER_SEC并不意味着一定等于1000000.)
OPEN_MAX- _SC_OPEN_MAX
每个进程的最大文件打开数. 不能少于 _POSIX_OPEN_MAX(20).
PAGESIZE- _SC_PAGESIZE
系统存储页长度. 至少为n1. (Some sys‐
temsuse PAGE_SIZE instead.)
RE_DUP_MAX- _SC_RE_DUP_MAX
当时用间隔表示法\{m,n\}时,regexec和regcomp函数允许的基本正则表达式的重复出现的次数.至少为_POSIX2_RE_DUP_MAX(255).
STREAM_MAX- _SC_STREAM_MAX
在任一时刻每个进程的最大标准I/O流数:如若定义,则其值一定与FOPEN_MAX相同.至少为 _POSIX_STREAM_MAX(8).
SYMLOOP_MAX
在解析路径名称期间,可遍历的符号链接数.至少为 _POSIX_SYMLOOP_MAX(8).
TTY_NAME_MAX- _SC_TTY_NAME_MAX
终端设备名长度,包括终止字符null. 长度至少为 _POSIX_TTY_NAME_MAX (9).
TZNAME_MAX- _SC_TZNAME_MAX
时区名的最大字节数.至少为_POSIX_TZNAME_MAX(6).
_POSIX_VERSION- _SC_VERSION
以YYYYMML的格式指明POSIX.1标准发布的年月.
1990版.
注:
man手册页中还包含了一些POSIX.2标准的选项,篇幅问题,我将其省去了,主要是我个人现在的水平还用不上那些所有的选项
就算是偷懒了~~~
返回值
如果选项名是非法的,函数返回-1,且errno指明为EINVAL.其他情况,返回系统资源的限制值 且 errno值不会改变.
一个选项如果被支持则返回一个正值,否则返回-1.在这种情况下,-1没有相关限制的定义.
fpathconf,pathconf - 获取文件的配置参数
摘要:
#include<unistd.h>
longfpathconf(int fd, int name);
longpathconf(char *path, int name);
描述
fpathconf()获取文件描述符为fd的可打开文件的配置选项的值.
pathconf()获取文件路径名称为path的可打开文件的配置选项的值.
头文件<unistd.h>中定义了相对应的宏的最小值.
设置一下的常量将获得相应的选项的值:
_PC_LINK_MAX
文件链接数的最大值. 如果 fd或是 path代表一个文件夹,则返回值对应整个文件夹. 其对应的宏为 _POSIX_LINK_MAX.
_PC_MAX_CANON
终端规范输入队列的最大字节数. 其对应的宏为 _POSIX_MAX_CANON.
_PC_MAX_INPUT
终端输入队列可用空间的字节数. 其对应的宏为_POSIX_MAX_INPUT.
_PC_NAME_MAX
文件名的最大字节数(不包括终止符null). 其对应的宏为 _POSIX_NAME_MAX.
_PC_PATH_MAX
相对路径名的最大字节数. 其对应的宏为 _POSIX_PATH_MAX.
_PC_PIPE_BUF
能原子地写到管道的最大字节数. 其对应的宏为 _POSIX_PIPE_BUF.
_PC_CHOWN_RESTRICTED
如果 chown(2)函数不能在此文件(夹)调用则返回非0值. 其对应的宏为 _POSIX_CHOWN_RESTRICTED.
_PC_NO_TRUNC
返回非零的数值指明路径名长于_POSIX_NAME_MAX是否将会产生错误. 其对应的宏为_POSIX_NO_TRUNC.
_PC_VDISABLE
若定义,可以使用此值禁用终端特殊字符.
返回值
如果选项存在,将返回其限制的值. 如果系统中没有此选项,则将返回-1,errno 并不会改变.
如果发生错误,将返回-1,且errno就出错的情况发生相应改变.