获得运行时限制函数
#include <unistd.h>
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);
(1)如果name参数并不是一个合适的常量,这3个函数都返回-1,并把errno置为EINVAL。
(2)有些name会返回一个变量值(返回值
≥
0)或者提示该值是不确定的。不确定的值通过返回-1来体现,而不改变errno的值。
(3)__SC__CLK__TCK的返回值是每秒的时钟滴答数,用于times函数的返回值。
对于pathconf的参数pathname和fpathconf的参数fd有很多限制。如果不满足其中任何一个限制,则结果是未定义的。
不确定的运行时限制
如果这些限制值没有在头文件
#include "apue.h"
#include <errno.h>
#include <limits.h>
#ifdef PATH_MAX
static long pathmax=PATH_MAX
#else
static long pathmax=0
#endif
static long posix_version=0;
static long xsi_version=0;
#define PATH_MAX_GUESS 1024
char * path_alloc(size_t *siezp)
{
char *ptr;
size_t size;
if(posix_version==0)
{
posix_version=sysconf(_SC_VERSION);
}
if(xsi_version==0)
{
xsi_version=sysconf(_SC_XOPEN_VERSION);
}
if(pathmax==0)
{
errno=0;
if((pathmax=pathconf("/",_PC_PATH_MAX))<0)
{
if(errno==0)
{
pathmax=PATH_MAX_GUESS;
}
else
{
err_sys("pathconf error for _PC_PATH_MAX");
}
}
else
{
pathmax++;
}
}
if((posix_version<200112L)&&(xsi_version<4))
{
size=pathmax+1;
}
else
{
size=pathmax;
}
if((ptr=malloc(size))==NULL)
{
err_sys("malloc error for pathname");
}
if(sizep!=NULL)
{
*sizep=size;
}
return ptr;
}
2、最大打开文件数
守护进程(daemon process,在后台运行且不与终端连接的一种进程)中一个常见的代码序列是关闭所有打开文件。
#include "apue.h"
#include <errno.h>
#include <limits.h>
#define OPEN_MAX_GUESS 256
long open_max(void)
{
if(openmax==0)
{
errno=0;
if((openmax=sysconf(_SC_OPEN_MAX))<0)
{
if(errno==0)
{
openmax=OPEN_MAX_GUESS;
}
else
{
err_sys("sysconf error for _SC_OPEN_MAX");
}
}
}
return openmax;
}
POSIX.1定义了3种处理选项的方法:
1、编译时选项定义在<unistd.h>中。
2、与文件或目录无关的运行时选项用sysconf函数来判断。
3、与文件或目录有关的运行时选项通过调用pathconf或fpathconf函数来判断。