UNIX标准化及实现之选项
POSIX.1的2001版,包括了ISO C标准所指定的各个函数。其接口分成了两类:必需接口和可选接口。可选接口按功能又进一步分成50个区。表1中按它们各自的选项代码总结了没有被弃用的编程接口。选项代码是由2-3个字符构成的字母缩写,以便标识属于各个功能区的接口。选项代码会突出显示手册相关页面上的文本,表明接口依赖于对特定选项的支持。很多选项处理实时扩展。
表1 POSIX.1可选接口组和代码(SUS,Single UNIX Specification)
| 代码 | SUS强制要求 | 符号常量 | 说明 |
| ADV | _POSIX_ADVISORY_INFO | 建议性信息(实时) | |
| AIO | _POSIX_ASYNCHRONOUS_IO | 异步输入和输出(实时) | |
| BAR | _POSIX_BARRIERS | 屏障(实时) | |
| CPT | _POSIX_CPUTIME | 进程CPU时钟(实时) | |
| CS | _POSIX_CLOCK_SELECTION | 时钟选择(实时) | |
| CX | 是 | ISO C标准扩展 | |
| FSC | 是 | _POSIX_FSYNC | 文件同步 |
| IP6 | _POSIX_IPV6 | IPv6接口 | |
| MF | 是 | _POSIX_MAPPED_FILES | 存储映射文件 |
| ML | _POSIX_MEMLOCK | 进程存储区加锁(实时) | |
| MLR | _POSIX_MEMLOCK_RANGE | 存储区域加锁(实时) | |
| MON | _POSIX_MONOTONIC_CLOCK | 单调时钟(实时) | |
| MPR | 是 | _POSIX_MEMORY_PROTECTION | 存储保护 |
| MSG | _POSIX_MESSAGE_PASSING | 消息传送(实时) | |
| MX | IEC 60559浮点选项 | ||
| PIO | _POSIX_PRIORITIZED_IO | 优先输入和输出 | |
| PS | _POSIX_PRIORITIZED_SCHEDULING | 进程调度(实时) | |
| RS | _POSIX_RAW_SOCKETS | 原始套接字 | |
| RTS | _POSIX_REALTIME_SIGNALS | 实时信号扩展 | |
| SEM | _POSIX_SEMAPHORES | 信号量(实时) | |
| SHM | _POSIX_SHARED_MEMORY_OBJECTS | 共享存储对象(实时) | |
| SIO | _POSIX_SYNCHRONIZED_IO | 同步输入和输出(实时) | |
| SPI | _POSIX_SPIN_LOCKS | 自旋锁(实时) | |
| SPN | _POSIX_SPAWN | 产生(实时) | |
| SS | _POSIX_SPORADIC_SERVER | 进程散发性(不定时发生的)服务器(实时) | |
| TCT | _POSIX_THREAD_CPUTIME | 线程CPU时钟(实时) | |
| TEF | _POSIX_TRACE_EVENT_FILTER | 跟踪事件过滤器 | |
| THR | 是 | _POSIX_THREADS | 线程 |
| TMO | _POSIX_TIMEOUTS | 超时(实时) | |
| TMR | _POSIX_TIMERS | 计时器(实时) | |
| TPI | _POSIX_THREAD_PRIO_INHERIT | 线程优先级集成(实时) | |
| TPP | _POSIX_THREAD_PRIO_PROTECT | 线程优先级保护(实时) | |
| TPS | _POSIX_THREAD_PRIORITY_SCHEDULING | 线程执行调度(实时) | |
| TRC | _POSIX_TRACE | 跟踪 | |
| TRI | _POSIX_TRACE_INHERIT | 跟踪继承 | |
| TRL | _POSIX_TRACE_LOG | 跟踪日志 | |
| TSA | 是 | _POSIX_THREAD_ATTR_STACKADDR | 线程栈地址属性 |
| TSF | 是 | _POSIX_THREAD_SAFE_FUNCTION | 线程安全的函数 |
| TSH | 是 | _POSIX_THREAD_PROCESS_SHARED | 线程进程共享的同步 |
| TSP | _POSIX_THREAD_SPORADIC_SERVER | 线程散发性服务器(实时) | |
| TSS | 是 | _POSIX_THREAD_ATTR_STACKSIZE | 线程栈地址大小 |
| TYM | _POSIX_TYPED_MEMORY_OBJECTS | 类型化的存储对象(实时) | |
| XSI | 是 | _XOPEN_UNIX | X/Open扩展接口 |
| XSR | _XOPEN_STREAMS | XSI STREAMS |
表1中列出了POSIX.1的选项,如果我们要编写一些可移植的应用程序,而这些程序与所有得到支持的选项有关,那么就需要一种可移植到方法以决定一种实现是否支持一个给定的选项。
如同对限制的处理一样,Single UNIX Specification定义了三种处理方法:
(1)编译时选项定义在<unistd.h>中。
(2)与文件或目录无关的选项用sysconf函数确定。
(3)与文件或目录有关的选项通过调用pathconf或fpathconf函数来发现。
选项包括在表1第3列中的符号,以及列在表2和表3中的符号。如若符号常量未定义,则必须使用sysconf、pathconf或fpathconf以决定该选项是否受到支持。在这种情况下,这些函数的name参数前缀_POSIX必须替换为_SC或_PC。对于以_XOPEN为前缀的常量,则在构成name参数时必须在其前放置_SC或_PC字符串。
如果该平台定义了符号常量,则有以下三种可能:
(1)如果符号常量的定义值为-1,那么该平台不支持相应的选项。
(2)如果符号常量的定义值大于0,那么该平台支持相应的选项。
(3)如果符号常量的定义值为0,则必须调用sysconf、pathconf或fpathconf以确定相应的选项是否受到支持。
表2 sysconf的选项及name参数
| 选项名字 | 说明 | name参数 |
| _POSIX_JOB_CONTROL | 指明此实现是否支持作业控制 | _SC_JOB_CONTROL |
| _POSIX_READER_WRITER_LOCKS | 指明此实现是否支持读者-写者锁 | _SC_READER_WRITER_LOCKS |
| _POSIX_SAVED_IDS | 指明此实现是否支持saved set-uesr-ID和saved set-group-ID | _SC_SAVED_IDS |
| _POSIX_SHELL | 指明此实现是否支持POSIX shell | _SC_SHELL |
| _POSIX_VERSION | 指明POSIX.1版本 | _SC_VERSION |
| _XOPEN_CRYPT | 指明此实现是否支持XSI加密选项组 | _SC_XOPEN_CRYPT |
| _XOPEN_LEGACY | 指明此实现是否支持XSI遗留选项组 | _SC_XOPEN_LEGACY |
| _XOPEN_REALTIME | 指明此实现是否支持XSI实时选项组 | _SC_XOPEN_REALTIME |
| _XOPEN_REALTIME_THREADS | 指明此实现是否支持XIS实时 线程选项组 | _SC_XOPEN_REALTIME_THREADS |
| _XOPEN_VERSION | 指明XSI版本 | _SC_XOPEN_VERSION |
表3 pathconf和fpathconf的选项及name参数
| 选项名字 | 说明 | name参数 |
| _POSIX_CHOWN_RESTRICTED | 指明使用chown是否是受限制的 | _PC_CHOWN_RESTRICTED |
| _POSIX_NO_TRUNC | 指明路径名长于NAME_MAX是否会出错 | _PC_NO_TRUNC |
| _POSIX_VDISABLE | 若定义,可以用此值禁用终端特殊字符 | _PC_VDISABLE |
| _POSIX_ASYNC_IO | 指明对相关联的文件是否可以使用异步I/O | _PC_ASYNC_IO |
| _POSIX_PRIO_IO | 指明对相关联的文件是否可以使用优先的I/O | _PC_PRIO_IO |
| _POSIX_SYNC_IO | 指明对相关联的文件是否可以使用同步I/O | _PC_SYNC_IO |
如果系统限制一样,关于sysconf、pathconf和fpathconf如何处理选项,有如下几点值得注意:
(1)_SC_VERSION的返回值表示与该标准相关的年(以4位数表示)和月(以2位数表示)。该值可能是198808L、199029L、199506L,或者表示该版本后续版本的其他值,与SUS v3相关的值是200112L。
(2)_SC_XOPEN_VERSION的返回值表示该系统遵循的XSI版本。与SUS v3相关联的值是600。
(3)_SC_JOB_CONTROL、_SC_SAVED_IDS以及_PC_VDISABLE的值不再表示可选功能。从SUS v3起,不再需要这些功能,但这些符号仍然被保留,以便向后兼容。
(4)如果所指定的pathname或filedes不支持此功能,那么_PC_CHOWN_RESTRICTED和_PC_NO_TRUNC返回-1,而不会改变errno。
(5)_PC_CHOWN_RESTRICTED引用的文件必须是文件或者目录。如果是目录,那么返回值指明该选项是否可应用于该目录中的各个文件。
(6)_PC_NO_TRUNC引用的文件必须是一个目录。其返回值可用于该目录中的各个文件名。
(7)_PC_VDISABLE引用的文件必须是一个终端文件。
为了遵循SUS v3,如果定义了某个选项符号,那么其值应该设置为0、-1或200112。如果未定义一个功能,也就是该系统未定义符号常量或对应的_SC或_PC名字,则将记录项标记为“未定义”。与此相对照,“已定义”记录项表示该符号常量已定义,但未指定值(例如:#define _POSIX_THREADS )。如若系统定义了符号常量,但其值为-1或0,但相应的sysconf或pathconf调用返回-1,那么该记录项将被标识为“不被支持”。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
UNIX标准化及实现之选项的更多相关文章
- 《UNIX环境高级编程》笔记--UNIX标准化及实现
1.UNIX标准化 1.1.ISO C 1989 年后期,C程序设计语言的ANSI(American National Standards Institute) 标准X3. 15 9-1989得到批准 ...
- UNIX标准化及实现之UNIX标准化、UNIX系统实现、标准和实现的关系以及ISO C标准头文件
一.UNIX标准化 1.ISO C (International Organization for Standardization) 2.IEEE POSIX (Institue of Electri ...
- 第二章:UNIX标准化及实现
本章节介绍个UNIX编程环境的标准化的进展,对ISO C,POSIX和Single UNIX Specification三个主要标准进行了说明 本章后面部分介绍了限制的具体实例. 我学习本章的心得是: ...
- UNIX标准化及实现之限制
前言 UNIX系统实现定义了很多幻数和常量,其中有很多已被硬编码(关于硬编码和软编码:http://www.cnblogs.com/chenkai/archive/2009/04/10/1432903 ...
- UNIX标准化及实现之功能测试宏
在头文件中定义了很多POSIX.1和XSI的符号.但是除了POSIX.1和XSI的定义之外,大多数实现在这些头文件中也加上了它们自己的定义.如果在编译一个程序时,希望它只使用POSIX定义而不使用任何 ...
- UNIX标准化及实现之POSIX标准必需头文件
POSIX标准定义的必需头文件 头文件 说明 <dirent.h> 目录项 <fcntl.h> 文件控制 <fnmatch.h> 文件名匹配类型 <glob. ...
- UNIX标准化及实现之标准之间的冲突
就整体而言,这些不同的标准之间配合得相当好.但是我们也很关注它们之间的差别,特别是ISO C标准和POSIX.1之间的差别. ISO C定义了函数clock,它返回进程使用的CPU时间,返回值类型是c ...
- UNIX标准化及实现之基本系统数据类型
历史上,某些UNIX系统变量已与某些C数据类型联系在一起.例如,历史上主.次设备号一直存放在一个16位的短整型中,8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要用多于256个值来表示 ...
- UNIX标准化及实现之POSIX标准可选头文件
POSIX标准定义的可选头文件 头文件 说明 <aio.h> 异步I/O <mqueue.h> 消息队列 <pthread.h> 线程 <sched.h> ...
随机推荐
- POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT,基础)
题意: 有一个环,环上n个点,现在在m个点对之间连一条线,线可以往圆外面绕,也可以往里面绕,问是否必定会相交? 思路: 根据所给的m条边可知,假设给的是a-b,那么a-b要么得绕环外,要么只能在环内, ...
- 陈正冲老师讲c语言之声明和定义的区别
什么是定义?什么是声明?它们有何区别? 举个例子: A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎 ...
- 《深入Java虚拟机学习笔记》- 第12章 整数运算
Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢 ...
- lightoj 1014
判断到根号n即可,另外使用dfs输出,不需要另开数组再排序. #include<cmath> #include<cstdio> int P, L, len, cnt; void ...
- Jenkin+TestNG进行自动化测试执行
1.登陆jenkins'后,主页面有一个jenkins管理选项,进入该模块,对插件,系统进行配置.(安装一个extend choice parameter插件) 2.点击new item新建一个项目, ...
- input文字方框中,字体颜色的变化 要求默认的字体颜色是灰色,当要输入字时,字体是正常的黑色
1 <input type=text name='address' size=60 maxlength=60 style="color:gray" value="( ...
- python 网络编程(一)---基础
1.理解TCP 1.1 寻址 首先任何基于TCP/IP的网络,每台机器都有唯一的IP地址,只需要知道接受者机器的IP地址,信息就可以传送过去. 其次,TCP通过使用端口号来知道机器究竟是哪个程序应该接 ...
- FFmpeg YUV视频序列编码为视频
上一篇已经写了如何配置好开发环境,这次就先小试牛刀,来个视频的编码.搞视频处理的朋友肯定比较熟悉YUV视频序列,很多测试库提供的视频数据都是YUV视频序列,我们这里就用用YUV视频序列来做视频.关于Y ...
- A Tour of Go Errors
An error is anything that can describe itself as an error string. The idea is captured by the predef ...
- vs之Nuget
1.http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 2.在Nuget控制台中安装特定版本: Install-Package <程序包 ...