一、限制
有很多由实现定义的幻数和常数,其中有很多已被编写到程序中,或由特定的技术所确定。由于大量标准化工作的努力,已有若干种可移植的方法用以确定这些幻数和实现定义的限制。这非常有助于软件的可移植性。
以下三种类型的功能是必需的:
? 编译时间选择项(该系统是否支持作业控制)。
? 编译时间限制(短整型的最大值是什么)。
? 运行时间限制(文件名的最大字符数为多少)。
前两个,编译时间选择项和限制可在头文件中定义。程序在编译时可以包含这些头文件。但是,运行时间限制则要求进程调用一个函数以获得此种限制值。
怎样才能找到一个特定系统实际支持的限制值呢? 正如前面提到的,某些限制值在编译时是可用的,而另外一些则必须在运行时确定。我们也曾提及在一个给定的系统中某些限制值是不会更改的,而其他则与文件和目录相关联。运行时间限制是由调用下面三个函数中的一个而取得的。
#include
long sysconf(int name) ;
log pathconf(const char* pathname,int name) ;
log fpathconf(int fields,int name) ;
所有函数返回:若成功为相应值,若出错为- 1。最后两个函数之间的差别是一个用路径名作为其参数,另一个则取文件描述符作为参数。
下面程序打印所有可能的sysconf和pathconf值。
#include
#include
#include
#include
static void pr_sysconf(char *,int);
static void pr_pathconf(char *,char *,int);
int main(int argc,char **argv)
{
if(argc != 2){
perror("usage: a.out ");
exit(1);
}
pr_sysconf("ARG_MAX =",_SC_ARG_MAX);//exec函数的参数最大长度(字节)
pr_sysconf("CHILD_MAX =",_SC_CHILD_MAX);//每个实际用户ID的最大进程数
pr_sysconf("clock ticks/second =",_SC_CLK_TCK);//每秒时钟滴答数
pr_sysconf("NGROUPS_MAX =",_SC_NGROUPS_MAX);//每个进程的最大同时添加组ID数
pr_sysconf("OPEN_MAX =",_SC_OPEN_MAX);//每个进程最大打开文件数
#ifdef _SC_STREAM_MAX
pr_sysconf("STREAM_MAX =",_SC_STREAM_MAX);//在任一时刻每个进程的最大标准I/O流数
#endif
#ifdef _SC_TZNAME_MAX
pr_sysconf("TZNAME_MAX =",_SC_TZNAME_MAX);//时区名中最大字节数
#endif
pr_sysconf("_POSIX_JOB_CONTROL =",_SC_JOB_CONTROL);//指明实现是否支持作业控制
pr_sysconf("_POSIX_SAVED_IDS =",_SC_SAVED_IDS);//实现是否支持保存的设置
pr_sysconf("_POSIX_VERSION =",_SC_VERSION);//指明POSIX.1版本
pr_pathconf("MAX_CANON =","/dev/tty",_PC_MAX_CANON);//在以终端规范输入队列的最大字节数
pr_pathconf("MAX_INPUT =","/dev/tty",_PC_MAX_INPUT);//终端输入队列可用空间字节数
pr_pathconf("_POSIX_VDISABLE =","/dev/tty",_PC_VDISABLE);//终端专用字符可用此值禁止
pr_pathconf("LINK_MAX =",argv[1],_PC_LINK_MAX);//文件连接数的最大值
pr_pathconf("NAME_MAX =",argv[1],_PC_NAME_MAX);//文件名中的最大字节数
pr_pathconf("PATH_MAX =",argv[1],_PC_PATH_MAX);//相对路径名中的最大字节数
pr_pathconf("PIPE_BUF =",argv[1],_PC_PIPE_BUF);//原子地写到一管道的最大字节数
pr_pathconf("_POSIX_NO_TRUNC =",argv[1],_PC_NO_TRUNC);//指明若路径名长于NAME_MAX是否产生以错误
pr_pathconf("_POSIX_CHOWN_RESTRICTED =",argv[1],_PC_CHOWN_RESTRICTED);//使用chown是否收到限制
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){
perror("sysconf error");
exit(1);
}
fputs("(not defined)\n",stdout);
}else
printf("%ld\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){
printf("pathconf error,path = %s\n",path);
exit(1);
}
fputs("(no limit)\n",stdout);
}else
printf("%ld\n",val);
}
下面是在ubuntu 12.04系统上的输出结果:
ARG_MAX =2097152
CHILD_MAX =256665
clock ticks/second =100
NGROUPS_MAX =65536
OPEN_MAX =1024
STREAM_MAX =16
TZNAME_MAX =6
_POSIX_JOB_CONTROL =1
_POSIX_SAVED_IDS =1
_POSIX_VERSION =200809
MAX_CANON =255
MAX_INPUT =255
_POSIX_VDISABLE =0
LINK_MAX =65000
NAME_MAX =255
PATH_MAX =4096
PIPE_BUF =4096
_POSIX_NO_TRUNC =1
_POSIX_CHOWN_RESTRICTED =1
阅读(2522) | 评论(0) | 转发(0) |