对于在不同 Unix 系统之间移植程序,最重要的事情就是确定新系统的一些编译时、运行时固定或不固定的限制值了。例如文件路径最大长度 PATH_MAX、进程最大可打开文件句柄数 OPEN_MAX、用户可加入的附加用户组最大数量 NGROUPS_MAX、进程命令行参数最大字节数 ARG_MAX、内存页大小 PAGESIZE、线程栈大小默认值 STACKSIZE、临时文件最大数量 TMP_MAX 等等。甚至有些系统特征也可以通过查询来提前确定,例如是否支持读写锁、是否支持异步 IO、是否支持实时信号等等,这样程序就可以根据系统提供的能力来选择不同的接口去实现同样的功能。
回头来看 apue 第二章有关系统限制与选项这一块的内容,由于掺杂了 UNIX 标准化的内容,显得很没有条理,例如将各种限制按标准划分为:
ISO C
编译时限制 (头文件常量)
POSIX
不变的最小值 (声明遵循 POSIX 的系统必需支持到至少这么多,不能再小了)
不变值 (SSIZE_MAX)
运行时可增加的值
运行时不变的值
路径名可变值
XSI
不变的最小值 (同上)
数值限制
运行时不变值
看得人一头雾水,其实如果抛开标准,单按限制的性质来分,就比较简单啦:
编译时限制 (通过头文件常量)
运行时限制
不与文件系统相关部分(通过 sysconf)
与文件系统相关部分(通过 pathconf)
也就是说,要确定一个系统限制,一共分两步:
确定相应的符号常量有没有在头文件定义,如果有,直接拿来用;
如果没有,走 sysconf 或 pathconf 查询。
对于系统选项,稍等复杂一点,分三步:
符号常量定义为 -1,平台不支持该选项;
符号常量定义大于 0,平台支持相应的选项;
符号常量定义为 0,需要进一步依靠 sysconf 或 pathconf 来查询。
到这里,你大概已经想到怎么自己制作一个工具了,那就是按上面的逻辑 coding 呗,可以把想要查的常量作为输入,查到的结果打印到控制台,为方便工具灵活的处理各种不同输入,常量可以作为命令行参数输入,就像下面这样: