这一章的阅读相对枯燥,20世纪80年代UNIX版本种类剧增以及他们之间的差别的扩大,导致很多用户呼吁对其进行标准化。
UNIX标准化介绍了ISO C IEEE POSIX Single UNIX Specification FIPS,这部分内容不详细总结。
UNIX系统实现介绍了 SVR4 4.4BSD Free BSD Linux Mac OSX Solaris.
UNIX系统中的“限制”,主要包括两类限制:
编译时限制,例如,短整型的最大值是多少。编译时限制可在头文件中定义,程序在编译时可包含这些头文件。
运行时限制,例如,文件名有多少个字符。运行时限制要求进程调用一个函数获得限制值。
但以上这些限制都不是绝对,某些限制在一个给定的实现中可能是固定的(可采用静态地在一个头文件中定义),而在另一个实现中可能是变动的(需要有一个运行时函数调用)。为了解决这类问题,操作系统提供了以下三种限制:
编译时限制(头文件)。
与文件或目录无关的运行时限制(sysconf函数)。
与文件或目录有关的运行时限制(pathconf和fpathconf函数)。
运行时限制可调用如下三个函数之一获得。
#include<unistd.h> @H_301_14@
long@H_301_14@ sysconf(int@H_301_14@ name);
long@H_301_14@ pathconf(const@H_301_14@ char@H_301_14@ *pathname,int@H_301_14@ name);
long@H_301_14@ fpathname(int@H_301_14@ fd,int@H_301_14@ name);
后两个函数的差别是:一个用路径名作为参数,一个则取文件描述符作为参数。
这里要着重谈一下这三个函数的返回值:
如果name参数不正确,那么这三个函数都返回-1,并将errno设为EINVAL。
如果某个name返回的值不确定,那么同样返回-1,但此时不改变errno的值,所以对于这三个函数的利用,首先需要设置errno为0,在返回-1的情况下,同时需要检查errno的值,若此时errno仍然为0,那么说明这个值在操作系统中没有定义。如果errno值不为0,那么调用函数时发生了错误。
若返回值>=0,那么说明程序正常返回。
由于本章中用到awk,所以要了解必要的awk知识:
执行awk的方法如下:
语法形式:awk -f awk脚本文件名 被处理文件名
./makeconf.awk sysconf.sym sysopt.sym
由于在makeconf.awk中getline(sysconf.sym) getline(pathconf.sym),所以可以省略被处理文件名。
./makeconf.awk即可生成我们所需要的C语言代码。
#include "apue.h"@H_301_14@
#include <errno.h>@H_301_14@
#include <limits.h>@H_301_14@
static@H_301_14@ void@H_301_14@ pr_sysconf(char@H_301_14@ *,int@H_301_14@);
static@H_301_14@ void@H_301_14@ pr_pathconf(char@H_301_14@ *,char@H_301_14@ *,int@H_301_14@);
int@H_301_14@
main(int@H_301_14@ argc,char@H_301_14@ *argv[])
{
if (argc != 2@H_301_14@)
err_quit("usage: a.out <dirname>"@H_301_14@);
#ifdef ARG_MAX@H_301_14@
printf("ARG_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)ARG_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for ARG_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_ARG_MAX@H_301_14@
pr_sysconf("ARG_MAX ="@H_301_14@,_SC_ARG_MAX);
#else@H_301_14@
printf("no symbol for _SC_ARG_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef ATEXIT_MAX@H_301_14@
printf("ATEXIT_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)ATEXIT_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for ATEXIT_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_ATEXIT_MAX@H_301_14@
pr_sysconf("ATEXIT_MAX ="@H_301_14@,_SC_ATEXIT_MAX);
#else@H_301_14@
printf("no symbol for _SC_ATEXIT_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef CHARCLASS_NAME_MAX@H_301_14@
printf("CHARCLASS_NAME_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)CHARCLASS_NAME_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for CHARCLASS_NAME_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_CHARCLASS_NAME_MAX@H_301_14@
pr_sysconf("CHARCLASS_NAME_MAX ="@H_301_14@,_SC_CHARCLASS_NAME_MAX);
#else@H_301_14@
printf("no symbol for _SC_CHARCLASS_NAME_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef CHILD_MAX@H_301_14@
printf("CHILD_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)CHILD_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for CHILD_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_CHILD_MAX@H_301_14@
pr_sysconf("CHILD_MAX ="@H_301_14@,_SC_CHILD_MAX);
#else@H_301_14@
printf("no symbol for _SC_CHILD_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef CLOCKTICKSPERSECOND /*clock ticks/second*/@H_301_14@
printf("CLOCKTICKSPERSECOND /*clock ticks/second*/ defined to be %ld\n"@H_301_14@,(long@H_301_14@)CLOCKTICKSPERSECOND /*clock ticks/second*/@H_301_14@+0@H_301_14@);
#else@H_301_14@
printf("no symbol for CLOCKTICKSPERSECOND /*clock ticks/second*/\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_CLK_TCK@H_301_14@
pr_sysconf("CLOCKTICKSPERSECOND /*clock ticks/second*/ ="@H_301_14@,_SC_CLK_TCK);
#else@H_301_14@
printf("no symbol for _SC_CLK_TCK\n"@H_301_14@);
#endif@H_301_14@
#ifdef COLL_WEIGHTS_MAX@H_301_14@
printf("COLL_WEIGHTS_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)COLL_WEIGHTS_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for COLL_WEIGHTS_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_COLL_WEIGHTS_MAX@H_301_14@
pr_sysconf("COLL_WEIGHTS_MAX ="@H_301_14@,_SC_COLL_WEIGHTS_MAX);
#else@H_301_14@
printf("no symbol for _SC_COLL_WEIGHTS_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef DELAYTIMER_MAX@H_301_14@
printf("DELAYTIMER_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)DELAYTIMER_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for DELAYTIMER_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_DELAYTIMER_MAX@H_301_14@
pr_sysconf("DELAYTIMER_MAX ="@H_301_14@,_SC_DELAYTIMER_MAX);
#else@H_301_14@
printf("no symbol for _SC_DELAYTIMER_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef HOST_NAME_MAX@H_301_14@
printf("HOST_NAME_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)HOST_NAME_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for HOST_NAME_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_HOST_NAME_MAX@H_301_14@
pr_sysconf("HOST_NAME_MAX ="@H_301_14@,_SC_HOST_NAME_MAX);
#else@H_301_14@
printf("no symbol for _SC_HOST_NAME_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef IOV_MAX@H_301_14@
printf("IOV_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)IOV_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for IOV_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_IOV_MAX@H_301_14@
pr_sysconf("IOV_MAX ="@H_301_14@,_SC_IOV_MAX);
#else@H_301_14@
printf("no symbol for _SC_IOV_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef LINE_MAX@H_301_14@
printf("LINE_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)LINE_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for LINE_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_LINE_MAX@H_301_14@
pr_sysconf("LINE_MAX ="@H_301_14@,_SC_LINE_MAX);
#else@H_301_14@
printf("no symbol for _SC_LINE_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef LOGIN_NAME_MAX@H_301_14@
printf("LOGIN_NAME_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)LOGIN_NAME_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for LOGIN_NAME_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_LOGIN_NAME_MAX@H_301_14@
pr_sysconf("LOGIN_NAME_MAX ="@H_301_14@,_SC_LOGIN_NAME_MAX);
#else@H_301_14@
printf("no symbol for _SC_LOGIN_NAME_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef NGROUPS_MAX@H_301_14@
printf("NGROUPS_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)NGROUPS_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for NGROUPS_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_NGROUPS_MAX@H_301_14@
pr_sysconf("NGROUPS_MAX ="@H_301_14@,_SC_NGROUPS_MAX);
#else@H_301_14@
printf("no symbol for _SC_NGROUPS_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef OPEN_MAX@H_301_14@
printf("OPEN_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)OPEN_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for OPEN_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_OPEN_MAX@H_301_14@
pr_sysconf("OPEN_MAX ="@H_301_14@,_SC_OPEN_MAX);
#else@H_301_14@
printf("no symbol for _SC_OPEN_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef PAGESIZE@H_301_14@
printf("PAGESIZE defined to be %ld\n"@H_301_14@,(long@H_301_14@)PAGESIZE+0@H_301_14@);
#else@H_301_14@
printf("no symbol for PAGESIZE\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_PAGESIZE@H_301_14@
pr_sysconf("PAGESIZE ="@H_301_14@,_SC_PAGESIZE);
#else@H_301_14@
printf("no symbol for _SC_PAGESIZE\n"@H_301_14@);
#endif@H_301_14@
#ifdef PAGE_SIZE@H_301_14@
printf("PAGE_SIZE defined to be %ld\n"@H_301_14@,(long@H_301_14@)PAGE_SIZE+0@H_301_14@);
#else@H_301_14@
printf("no symbol for PAGE_SIZE\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_PAGE_SIZE@H_301_14@
pr_sysconf("PAGE_SIZE ="@H_301_14@,_SC_PAGE_SIZE);
#else@H_301_14@
printf("no symbol for _SC_PAGE_SIZE\n"@H_301_14@);
#endif@H_301_14@
#ifdef RE_DUP_MAX@H_301_14@
printf("RE_DUP_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)RE_DUP_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for RE_DUP_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_RE_DUP_MAX@H_301_14@
pr_sysconf("RE_DUP_MAX ="@H_301_14@,_SC_RE_DUP_MAX);
#else@H_301_14@
printf("no symbol for _SC_RE_DUP_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef RTSIG_MAX@H_301_14@
printf("RTSIG_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)RTSIG_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for RTSIG_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_RTSIG_MAX@H_301_14@
pr_sysconf("RTSIG_MAX ="@H_301_14@,_SC_RTSIG_MAX);
#else@H_301_14@
printf("no symbol for _SC_RTSIG_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef SEM_NSEMS_MAX@H_301_14@
printf("SEM_NSEMS_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)SEM_NSEMS_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for SEM_NSEMS_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_SEM_NSEMS_MAX@H_301_14@
pr_sysconf("SEM_NSEMS_MAX ="@H_301_14@,_SC_SEM_NSEMS_MAX);
#else@H_301_14@
printf("no symbol for _SC_SEM_NSEMS_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef SEM_VALUE_MAX@H_301_14@
printf("SEM_VALUE_MAX defined to be %ld\n"@H_301_14@,(long@H_301_14@)SEM_VALUE_MAX+0@H_301_14@);
#else@H_301_14@
printf("no symbol for SEM_VALUE_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef _SC_SEM_VALUE_MAX@H_301_14@
pr_sysconf("SEM_VALUE_MAX ="@H_301_14@,_SC_SEM_VALUE_MAX);
#else@H_301_14@
printf("no symbol for _SC_SEM_VALUE_MAX\n"@H_301_14@);
#endif@H_301_14@
#ifdef SIGQUEUE_MAX@H_