- 浏览: 142352 次
文章分类
最新评论
UNIX系统实现定义了很多幻数和常量,其中有很多已被硬编码到程序中,或用特定的技术确定。由于大量标准化工作的努力,已有若干种可移植的方法用以确定这些幻数和具体实现定义的限制。这非常有助于改善UNIX环境下软件的可移植性。
以下两种类型的限制是必需的:
1、编译时限制(例如,短整型的最大值是什么?)
2、运行时限制(例如,文件名有多少个字符?)
编译时限制可在头文件中定义,程序在编译时可以包含这些头文件。但是,运行时限制则要求进程调用一个函数获得限制值。
另外,某些限制在一个给定的实现中可能是固定的(因此可以静态地定义在一个头文件中),而在另一个实现中则可能是变动的(需要有一个运行时函数调用)。这种类型限制的一个例子是文件名的最大字符数。为了解决这类问题,提供了以下3种限制:
1、编译时限制(头文件)。
2、与文件或目录无关的运行时限制(sysconf 函数)。
3、与文件或目录有关的运行时限制(pathconf 和 fpathconf 函数)。
如果一个特定的运行时限制在一个给定的系统中并不改变,则可将其静态地定义在一个头文件中。但是,如果没有将其定义在头文件中,应用程序就必须调用3个conf函数中的一个,以确定其运行时限制。
要如何才能找到一个特定系统实际支持的限制值呢?运行时限制可调用下面三个函数之一获得:
sysconf函数的name参数用来标识系统限制,以 _SC_ 开始的常量用作标识运行时限制的syscon参数。下表是sysconf函数所使用的name参数:
pathconf和fpathconf函数为标识系统限制所使用的name参数如下表:
现在再来详细地讨论一下这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引用的文件必须是目录。返回值是该目录中符号链接可包含字符串的最大长度。
下面这个程序可用来打印这些限制:
参考书籍:《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_MAX | exec函数的参数最大长度(字节) | _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_MAX | gethostname函数返回的主机名最大长度 | _SC_HOST_NAME_MAX |
IOV_MAX | readv或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标准及实现。
发表评论
-
浮点运算指令
2019-05-22 23:13 1575上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1710在浮点寄存 ... -
浮点寄存器概述
2019-05-14 22:31 2589本文介绍的浮点寄存器是基于 AVX2(Adva ... -
汇编指令之跳转指令
2019-04-15 00:21 4798正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2359在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1382下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1288在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 993Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 608源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 398传统的linux中定义了七个运行级,分别如下: ... -
linux引导加载程序--GRUB
2017-04-04 04:22 625linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 553注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 695注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 561注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 361在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
程序优化之存储器别名使用
2016-05-20 08:55 797说明:本文示例摘自《深入理解计算机系统》第五章----优化程序 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1579对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1839对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 668对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 424我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
同时,书中还讨论了标准与实现的关系,以及系统限制和标准之间可能存在的冲突。 书中强调了程序和进程管理的重要性,如进程的创建和终止、程序的存储空间布局、共享库、存储器分配、环境变量、进程控制和信号处理等...
3. **LICENSE.TXT**:这是关于软件授权的信息,通常会规定软件的使用条件、版权归属以及可能的限制。 4. **UNIX2DOS.EXE**:这是可执行文件,用于将Linux/Unix格式的文件转换为Windows格式。 5. **DOS2UNIX.C**:...
5. **进程管理**:讨论进程创建、调度、通信和监控的机制,以及各自的优势和限制。 6. **网络服务**:比较DNS、HTTP、FTP等网络服务在不同UNIX上的实现,包括配置的复杂性和安全性。 7. **开发环境与工具**:介绍...
本知识点将详细介绍Unix进程的不同方面,包括进程的属性、资源限制、进程间通信以及如何管理进程。 首先,Unix进程有唯一的进程标识符(PID),这是操作系统区分各个进程的依据。每个进程都拥有自己的父进程,通常...
- StdDisclaimer.html:通常是一个法律免责声明,提醒用户关于软件的使用限制和责任问题。 - cygpopt-0.rar:可能是Cygwin的一个组件或优化包,用于增强Windows上的Unix工具功能。 - UnxUpdates.zip:可能包含...
- **版权限制与挑战**: Western Electric公司为了保护其商业利益,限制了该书的正式出版,并仅允许已获得UNIX许可证的机构和个人获取。然而,这种限制并没有阻止本书在更广泛的范围内传播。 - **对后世的影响**: ...
书中探讨了不同操作系统上缓冲区大小和限制,以及网络编程中常见的错误处理方法。 对于初学者来说,书中从一个简单的daytime客户端和服务器的例子出发,逐步讲解了如何使用各种套接字接口进行网络编程。通过这些...
在Unix系统中,资源限制可以分为软限制和硬限制,软限制是实际可设置的资源上限,而硬限制则是软限制的上限。可以使用getrlimit()和setrlimit()系统调用来查看和修改进程的资源限制。 Unix进程拥有环境,环境是指...
HP UNIX 命令集 HP UNIX 命令集是 HP 小型机的操作系统命令集,用于查看和管理 HP 小型机的信息。下面是查看 HP 小型机的信息的命令集: 1. 查看机型命令:#model 该命令用于查看 HP 小型机的机型号,例如 9000/...
由于附件大小限制,本资源共分为4个部分,文件列表如下: UNIX Network Programming - vol1 ed3 The Sockets Networking API.chm Unix Network Programming - vol2 ed2 lnterprocess Communications.pdf UNIX网络...
HP-Unix二级等保测评实施指南 本文档提供了HP-Unix等保二级测评的实施指南,涵盖了身份鉴别、访问控制、身份标识和鉴别机制等多个方面的安全要求。下面是从给定的文件中提取的相关知识点: 一、身份鉴别(S2) ...
- **系统移植**:1970年,UNIX首次被移植到了PDP-11/20计算机上,这是一个里程碑式的事件,标志着UNIX开始超越单一平台的限制。 #### 四、UNIX的扩散与普及 - **许可证发放与源代码分享**:起初,AT&T并未将UNIX视...
本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别...
- 文件名由字母、数字和某些特殊字符组成,长度有限制。 **3.5 UNIX文件存取权限** - 文件权限分为读、写和执行三种。 - 每个文件都有针对所有者、同组用户和其他用户的权限设置。 **3.6 UNIX重定向与管道** - ...
13. **系统资源管理**:如ulimit命令用于限制进程的资源使用,以及如何调整系统资源分配。 14. **脚本自动化**:通过shell脚本实现日常任务自动化,如cron定时任务的配置和使用。 15. **软件包管理和安装**:介绍...
- **无类型和应用关联**:这意味着文件类型和相关的应用程序信息不能存储在文件本身之外,这对某些高级功能造成了限制。 - **一切皆流**:Unix中的一切都被视为字节流,即使是硬件设备也被处理成字节流的形式。这一...
### Unix系统常用命令总结 Unix系统作为现代操作系统的基础之一,其强大的命令行工具为用户提供了高效的操作环境。本文将从给定的文件信息出发,深入探讨Unix系统中的常用命令及其应用,同时也会提及C++编程在Unix...
理解这些内存管理函数的使用和限制,可以避免内存泄漏和提高程序效率。 5. 获得当前时间:`time`函数获取当前时间,返回的是一个表示从1970年1月1日到现在的秒数。`gmtime`和`localtime`可以将这个时间戳转换为...