前因
unix系统实现了很多的幻数和常量来确保软件的移植性。通过很多的标准化的工作的完善,对于这些幻数和常量都有了一定的限制。
1.不与文件或目录相关联的运行时限制(sysconf函数)。
2.与文件或目录相关联的运行时限制(pathconf和 pathconf函数)
pathconf
头文件
#include <unistd.h>
函数原型
long pathconf(char *path, int name); //unix中第一个参数有const
long fpathconf(int fd, int name);
pathconf和fpathconf的限制及name参数
sysconf
头文件
#include <unistd.h>
函数原型
long sysconf(int name);
sysconf的限制及name参数
unix环境高级编程的例子
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
static void pr_sysconf(char *, int);
static void pr_pathconf(char *, char *, int);
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("usage: a.out <dirname>");
}
#ifdef ARG_MAX
printf("ARG_MAX defined to be %d\n", ARG_MAX+0);
#else
printf("no symbol for ARG_MAX\n");
#endif
#ifdef _SC_ARG_MAX
pr_sysconf("ARG_MAX =", _SC_ARG_MAX);
#else
printf("no symbol for _SC_ARG_MAX\n");
#endif
#ifdef MAX_CANON
printf("MAX_CANON defined to be %d\n", MAX_CANON+0);
#else
printf("no symbol for MAX_CANON\n");
#endif
#ifdef _PC_MAX_CANON
pr_pathconf("MAX_CANON =", argv[1], _PC_MAX_CANON);
#else
printf("no symbol for _PC_MAX_CANON\n");
#endif
exit(0);
}
static void pr_sysconf(char *mesg, int name)
{
long val;
fputs(mesg, stdout);
errno = 0;
if((val = sysconf(name)) < 0)
{
if(errno != 0)
{
if(errno == EINVAL)
{
fputs(" (not supported)\n", stdout);
}
else
{
printf("sysconf error");
}
}
else
{
fputs(" (no limit)\n", stdout);
}
}
else
{
printf(" %ld\n\n", val);
}
}
static void pr_pathconf(char *mesg, char *path, int name)
{
long val;
fputs(mesg, stdout);
errno = 0;
if((val = pathconf(path, name)) < 0)
{
if(errno != 0)
{
if(errno == EINVAL)
{
fputs(" ( not supported)\n", stdout);
}
else
{
printf("pathconf error, path = %s", path);
}
}
else
{
fputs(" ( no limit)\n", stdout);
}
}
else
{
printf(" %ld \n", val);
}
}