11-系统选项
11.5 系统选项
除了对各种系统资源的限制加以规范外,SUSv3还规定了UNIX实现可支持的各种选项。这包括对诸如实时信号、POSIX共享内存、任务控制以及POSIX线程之类功能的支持。除少数特例外,并未要求实现支持这些选项。相反,对于实现在编译及运行时是否支持某一特定特性,SUSv3允许实现自行给出建议。
通过在<unistd.h>文件中定义相应常量,实现能够在编译时通告其对特定SUSv3选项的支持。此类常量的命名均会冠以前缀(比如POSIX 或者XOPEN),以标识其源于何种标准。
各个选项常量,一经定义,其值必为下列之一。
- 值为−1,表示实现不支持该选项。此时,系统实现无需定义与该选项有关的头文件、数据类型和函数接口。可以使用#if预处理程序指令,通过条件编译来处理这种情况。
- 值为0,表示实现可能支持该选项。应用程序必须在运行时检查该选项是否获得支持。
- 值大于0,则表示实现支持该选项。实现定义了与该选项有关的所有头文件、数据类型和函数接口,且其行为也符合规范要求。在很多情况下,SUSv3要求这一正值为200112L,该常量对应于批准SUSv3标准的年、月。(SUSv4中,将类似功能的值设为200809L。)
当定义常量为0时,应用程序可使用sysconf()和pathconf()(或f pathconf())在运行时检查选项是否获得实现的支持。传递给这些函数的入参name,其命名通常与编译时常量形式相同,只是前缀为SC 或 _PC_所取代。系统实现必须至少提供头文件、常量以及实施运行时检查所必要的函数接口。
对于未定义的选项常量,其含义到底等同于常量0(可能支持该选项)还是−1(不支持该选项),SUSv3并未做出明确规定。随后,标准委员会作出裁决,规定这种情况应与定义为−1的常量含义相同,并且SUSv4对此明确作出了规定。
表11-3列举了SUSv3所规定的一些选项。表中第一列针对选项(定义于<unistd.h>文件中)给出了相关编译时常量的名称,以及sysconf()(SC)和pathconf()(PC)函数的相应入参name值。对于特定选项,请注意以下几点。
- 某些选项在SUSv3中是必需的,即编译时其常量值总应大于0。历史上,这些选项一度确实曾是可选项,但如今已是时过境迁。“备注”栏会以字符“+”标识此类选项。(许多在SUSv3中的可选项在SUSv4中已经成为必选项。)
虽然这些选项在SUSv3中是必需的,但在安装一些UNIX系统时,若配置不当,系统依然会与规范不符。因此,对可移植的应用程序而言,不管标准是否对影响应用的选项作出了要求,总应检查系统是否支持该选项。
- 对于某些选项,其编译时常量必须为-1以外的值。换言之,要么必须支持该选项,要么必须有方法可以检查出系统在运行时是否支持该选项。这些选项的“备注”栏以字符“*”标识这些选项。
| 选项(常量)名 (sysconf() / pathconf()入参name名) | 描 述 | 备注 | | :----- | :----- | :----- | :----- | :----- | | _POSIX_ASYNCHRONOUS_IO (_SC_ASYNCHRONOUS_IO) | 异步I/O | | _POSIX_CHOWN_RESTRICTED (_PC_CHOWN_RESTRICTED) | 仅有特权级进程能够使用chown() 和fchown()函数将文件的用户ID和组ID修改为任意值 (15.3.2节) | * | | _POSIX_JOB_CONTROL (_SC_JOB_CONTROL) | 作业控制(34.7节) | + | | _POSIX_MESSAGE_PASSING (_SC_MESSAGE_PASSING) | POSIX 消息队列(第52章) | | _POSIX_PRIORITY_SCHEDULING (_SC_PRIORITY_SCHEDULING) | 进程调度(35.3节) | | _POSIX_REALTIME_SIGNALS (_SC_REALTIME_SIGNALS) | 实时信号扩展(22.8节) | + | | _POSIX_SAVED_IDS(none) | 进程拥有的保存(saved)set-user-ID和保存(saved)set-group-ID(9.4节) | | _POSIX_SEMAPHORES (_SC_SEMAPHORES) | POSIX信号(第53章) | | _POSIX_SHARED_MEMORY_OBJECTS (_SC_SHARED_MEMORY_OBJECTS) | POSIX 共享内存对象(第54章) | | _POSIX_THREADS (_SC_THREADS) | POSIX 线程 | | _XOPEN_UNIX (_SC_XOPEN_UNIX) | 支持XSI 扩展功能(1.3.4节) |