`

unix限制

阅读更多
        UNIX系统实现定义了很多幻数和常量,其中有很多已被硬编码到程序中,或用特定的技术确定。由于大量标准化工作的努力,已有若干种可移植的方法用以确定这些幻数和具体实现定义的限制。这非常有助于改善UNIX环境下软件的可移植性。
        以下两种类型的限制是必需的:
        1、编译时限制(例如,短整型的最大值是什么?)
        2、运行时限制(例如,文件名有多少个字符?)
        编译时限制可在头文件中定义,程序在编译时可以包含这些头文件。但是,运行时限制则要求进程调用一个函数获得限制值。
        另外,某些限制在一个给定的实现中可能是固定的(因此可以静态地定义在一个头文件中),而在另一个实现中则可能是变动的(需要有一个运行时函数调用)。这种类型限制的一个例子是文件名的最大字符数。为了解决这类问题,提供了以下3种限制:
        1、编译时限制(头文件)。
        2、与文件或目录无关的运行时限制(sysconf 函数)。
        3、与文件或目录有关的运行时限制(pathconf 和 fpathconf 函数)。
        如果一个特定的运行时限制在一个给定的系统中并不改变,则可将其静态地定义在一个头文件中。但是,如果没有将其定义在头文件中,应用程序就必须调用3个conf函数中的一个,以确定其运行时限制。
        要如何才能找到一个特定系统实际支持的限制值呢?运行时限制可调用下面三个函数之一获得:
#include <unistd.h>

long sysconf(int name);
long pathconf(const char *pathname, int name);   // 用路径名作为参数
long fpathconf(int fd, int name);                // 用文件描述符作为参数
           /* 所有函数返回值:若成功,返回相应值;若出错,返回 -1 */

        sysconf函数的name参数用来标识系统限制,以 _SC_ 开始的常量用作标识运行时限制的syscon参数。下表是sysconf函数所使用的name参数:
限制名说明name参数
ARG_MAXexec函数的参数最大长度(字节)_SC_ARG_MAX
ATEXIT_MAX可用atexit函数登记的最大函数个数_SC_ATEXIT_MAX
CHILD_MAX每个实际用户ID的最大进程数_SC_CHILD_MAX
时钟滴答/秒每秒时钟滴答数_SC_CLK_TCK
COLL_WEIGHTS_MAX本地定义文件中可赋予LC_COLLATE顺序关键字项的最大权重数_SC_COLL_WEIGHTS_MAX
DELAYTIMER_MAX定时器最大超限运行次数_SC_DELAYTIMER_MAX
HOST_NAME_MAXgethostname函数返回的主机名最大长度_SC_HOST_NAME_MAX
IOV_MAXreadv或writev函数可使用的最多iovec结构的个数_SC_IOV_MAX
LINE_MAX实用程序输入行的最大长度_SC_LINE_MAX
LOGIN_NAME_MAX登录名的最大长度_SC_LOGIN_NAME_MAX
NGROUPS_MAX每个进程同时添加的最大进程组ID数_SC_NGROUPS_MAX
OPEN_MAX每个进程最大打开文件数_SC_OPEN_MAX
PAGESIZE系统存储页长度(字节)_SC_PAGESIZE
PAGE_SIZE系统存储页长度(字节)_SC_PAGE_SIZE
RE_DUP_MAX使用间隔表示法\{m,n\}时,函数regexec和regcomp允许的基本正则表达式重复发生次数_SC_RE_DUP_MAX
RTSIG_MAX为应用程序预留的实时信号的最大个数_SC_RTSIG_MAX
SEM_NSEMS_MAX一个进程可使用的信号量最大个数_SC_SEM_NSEMS_MAX
SEM_VALUE_MAX信号量的最大值_SC_SEM_VALUE_MAX
SIGQUEUE_MAX一个进程可排队信号的最大个数_SC_SIGQUEUE_MAX
STREAM_MAX一个_SC_STREAM_MAX进程在任意给定时刻标准I/O流的最大个数。如果定义,必须与FOPEN_MAX有相同值_SC_STREAM_MAX
SYMLOOP_MAX在解析路径名时,可遍历的符号链接数_SC_SYMLOOP_MAX
TIMER_MAX每个进程的最大定时器个数_SC_TIMER_MAX
TTY_NAME_MAX终端设备名长度,包括终止null字节_SC_TTY_NAME_MAX
TZNAME_MAX时区名中的最大字节数_SC_TZNAME_MAX

        pathconf和fpathconf函数为标识系统限制所使用的name参数如下表:
限制名说明name参数
FILESISEBITS以带符号整型值表示在指定目录中允许的普通文件最大长度所需的最小位数_PC_FILESISEBITS
LINK_MAX文件链接计数的最大值_PC_LINE_MAX
MAX_CANON终端规范输入队列的最大字节数_PC_MAX_CANON
MAX_INPUT终端输入队列可用空间的字节数_PC_MAX_INPUT
NAME_MAX文件名的最大字节数(不包括终止null字节)_PC_NAME_MAX
PATH_MAX相对路径名的最大字节数,包括终止null字节_PC_PATH_MAX
PIPE_BUF能原子地写到管道的最大字节数_PC_PIPE_BUF
_POSIX_TIMESTAMP_RESOLUTION文件时间戳的纳秒精度_PC_TIMESTAMP_RESOLUTION
SYMLINK_MAX符号链接的字节数_PC_SYMLINK_MAX

        现在再来详细地讨论一下这3个函数不同的返回值。
        1、若name参数不是一个合适的常量,这3个函数都返回-1,并把errno置为EINVAL。
        2、有些name会返回一个变量值(>=0)或者提示该值是不确定的。不确定的值通过返回-1来体现,而不改变errno的值。
        3、_SC_CLK_TCK的返回值是每秒的时钟滴答数,用于times函数的返回值。
        对于pathconf的参数pathname和fpathconf的参数fd有很多限制。如果不满足以下其中任何一个限制,则结果是未定义的:
        1、_PC_MAX_CANON和_PC_MAX_INPUT引用的文件必须是终端文件。
        2、_PC_LINK_MAX和_PC_TIMESTAMP_RESOLUTION引用的文件可以是文件或目录。如果是目录,则返回值用于目录本身,而不用于目录内的文件名项。
        3、_PC_FILESIZEBITS和_PC_NAME_MAX引用的文件必须是目录,返回值用于该目录中的文件名。
        4、_PC_PATH_MAX引用的文件必须是目录。但所指定的目录是工作目录时,返回值是相当路径名的最大长度。
        5、_PC_PIPE_BUF引用的文件必须是管道、FIFO或目录。在管道或FIFO情况下,返回值是对所引用的管道或FIFO的限制值。对于目录,返回值是对在该目录中创建的任一FIFO的限制值。
        6、_PC_SYMLINK_MAX引用的文件必须是目录。返回值是该目录中符号链接可包含字符串的最大长度。
        下面这个程序可用来打印这些限制:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <limits.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: %s <dirname>", argv[0]);
		exit(0);
	}

#ifdef ARG_MAX
	printf("ARG_MAX defined to be %ld\n", (long)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

	/* similar processing for all the rest of the sysconf symbols ... */

#ifdef MAX_CANON
	printf("MAX_CNAON defined to be %ld\n", (long)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

	/* similar processing for all the rest of the pathconf symbols ... */

	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\n");
		}else{
			fputs(" (no limit)\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){
			if(errno == EINVAL)	
				fputs(" (not supported)\n", stdout);
			else
				printf("pathconf error, path = %s\n", path);
		}else{
			fputs(" (no limit)\n", stdout);
		}
	}else{
		printf(" %ld\n", val);	
	}
}


参考书籍:《UNIX环境高级编程》第二章:UNIX标准及实现。
分享到:
评论

相关推荐

    UNIX环境高级编程

    同时,书中还讨论了标准与实现的关系,以及系统限制和标准之间可能存在的冲突。 书中强调了程序和进程管理的重要性,如进程的创建和终止、程序的存储空间布局、共享库、存储器分配、环境变量、进程控制和信号处理等...

    dos2unix for windows

    3. **LICENSE.TXT**:这是关于软件授权的信息,通常会规定软件的使用条件、版权归属以及可能的限制。 4. **UNIX2DOS.EXE**:这是可执行文件,用于将Linux/Unix格式的文件转换为Windows格式。 5. **DOS2UNIX.C**:...

    各种UNIX比较。目前主流unix的全面对比

    5. **进程管理**:讨论进程创建、调度、通信和监控的机制,以及各自的优势和限制。 6. **网络服务**:比较DNS、HTTP、FTP等网络服务在不同UNIX上的实现,包括配置的复杂性和安全性。 7. **开发环境与工具**:介绍...

    working with unix process

    本知识点将详细介绍Unix进程的不同方面,包括进程的属性、资源限制、进程间通信以及如何管理进程。 首先,Unix进程有唯一的进程标识符(PID),这是操作系统区分各个进程的依据。每个进程都拥有自己的父进程,通常...

    unix tools for windows

    - StdDisclaimer.html:通常是一个法律免责声明,提醒用户关于软件的使用限制和责任问题。 - cygpopt-0.rar:可能是Cygwin的一个组件或优化包,用于增强Windows上的Unix工具功能。 - UnxUpdates.zip:可能包含...

    莱昂氏UNIX源代码分析(完整版)

    - **版权限制与挑战**: Western Electric公司为了保护其商业利益,限制了该书的正式出版,并仅允许已获得UNIX许可证的机构和个人获取。然而,这种限制并没有阻止本书在更广泛的范围内传播。 - **对后世的影响**: ...

    Unix网络编程英文版PDF

    书中探讨了不同操作系统上缓冲区大小和限制,以及网络编程中常见的错误处理方法。 对于初学者来说,书中从一个简单的daytime客户端和服务器的例子出发,逐步讲解了如何使用各种套接字接口进行网络编程。通过这些...

    working-with-unix-processes

    在Unix系统中,资源限制可以分为软限制和硬限制,软限制是实际可设置的资源上限,而硬限制则是软限制的上限。可以使用getrlimit()和setrlimit()系统调用来查看和修改进程的资源限制。 Unix进程拥有环境,环境是指...

    hp-UNIX命令集

    HP UNIX 命令集 HP UNIX 命令集是 HP 小型机的操作系统命令集,用于查看和管理 HP 小型机的信息。下面是查看 HP 小型机的信息的命令集: 1. 查看机型命令:#model 该命令用于查看 HP 小型机的机型号,例如 9000/...

    (3/4)Unix Network Programming vol1 & vol2 - Unix网络编程第1卷 第2卷

    由于附件大小限制,本资源共分为4个部分,文件列表如下: UNIX Network Programming - vol1 ed3 The Sockets Networking API.chm Unix Network Programming - vol2 ed2 lnterprocess Communications.pdf UNIX网络...

    信息安全等级保护测评实施HP-Unix二级作业指导书.doc

    HP-Unix二级等保测评实施指南 本文档提供了HP-Unix等保二级测评的实施指南,涵盖了身份鉴别、访问控制、身份标识和鉴别机制等多个方面的安全要求。下面是从给定的文件中提取的相关知识点: 一、身份鉴别(S2) ...

    UNIX发展史 原创:孟晓亮

    - **系统移植**:1970年,UNIX首次被移植到了PDP-11/20计算机上,这是一个里程碑式的事件,标志着UNIX开始超越单一平台的限制。 #### 四、UNIX的扩散与普及 - **许可证发放与源代码分享**:起初,AT&T并未将UNIX视...

    UNIX环境高级编程(PDF)

    本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别...

    UNIX学习教材

    - 文件名由字母、数字和某些特殊字符组成,长度有限制。 **3.5 UNIX文件存取权限** - 文件权限分为读、写和执行三种。 - 每个文件都有针对所有者、同组用户和其他用户的权限设置。 **3.6 UNIX重定向与管道** - ...

    UNIX PROGRAMMER'S MANUAL

    13. **系统资源管理**:如ulimit命令用于限制进程的资源使用,以及如何调整系统资源分配。 14. **脚本自动化**:通过shell脚本实现日常任务自动化,如cron定时任务的配置和使用。 15. **软件包管理和安装**:介绍...

    The Art of Unix Programming

    - **无类型和应用关联**:这意味着文件类型和相关的应用程序信息不能存储在文件本身之外,这对某些高级功能造成了限制。 - **一切皆流**:Unix中的一切都被视为字节流,即使是硬件设备也被处理成字节流的形式。这一...

    unix系统常用命令总结文档

    ### Unix系统常用命令总结 Unix系统作为现代操作系统的基础之一,其强大的命令行工具为用户提供了高效的操作环境。本文将从给定的文件信息出发,深入探讨Unix系统中的常用命令及其应用,同时也会提及C++编程在Unix...

    UNIX环境高级编程教程

    理解这些内存管理函数的使用和限制,可以避免内存泄漏和提高程序效率。 5. 获得当前时间:`time`函数获取当前时间,返回的是一个表示从1970年1月1日到现在的秒数。`gmtime`和`localtime`可以将这个时间戳转换为...

Global site tag (gtag.js) - Google Analytics