本节书摘来自异步社区《UNIX环境高级编程(第3版)》一书中的第2章,第2.6节,作者:【美】W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.6 选项
图2-5列出了POSIX.1的选项,并且2.2.3节讨论了XSI的选项组。如果我们要编写可移植的应用程序,而这些程序可能会依赖于这些可选的支持的功能,那么就需要一种可移植的方法来判断实现是否支持一个给定的选项。
如同对限制的处理(见2.5节)一样,POSIX.1定义了3种处理选项的方法。
(1)编译时选项定义在中。
(2)与文件或目录无关的运行时选项用sysconf函数来判断。
(3)与文件或目录有关的运行时选项通过调用pathconf或fpathconf函数来判断。
选项包括了图2-5中第3列的符号以及图2-19和图2-18中的符号。如果符号常量未定义,则必须使用sysconf、pathconf或fpathconf来判断是否支持该选项。在这种情况下,这些函数的name参数前缀_POSIX必须替换为_SC或_PC。对于以_XOPEN为前缀的常量,在构成name参数时必须在其前放置_SC或_PC。例如,若常量_POSIX_RAW_THREADS是未定义的,那么就可以将name参数设置为SC_RAW_THREADS,并以此调用sysconf来判断该平台是否支持POSIX线程选项。如若常量_XOPEN_UNIX是未定义的,那么就可以将name参数设置为_SC_XOPEN_UNIX,并以此调用sysconf来判断该平台是否支持XSI扩展。
对于每一个选项,有以下3种可能的平台支持状态。
(1)如果符号常量没有定义或者定义值为−1,那么该平台在编译时并不支持相应选项。但是有一种可能,即在已支持该选项的新系统上运行老的应用时,即使该选项在应用编译时未被支持,但如今新系统运行时检查会显示该选项已被支持。
(2)如果符号常量的定义值大于0,那么该平台支持相应选项。
(3)如果符号常量的定义值为0,则必须调用sysconf、pathconf或fpathconf来判断相应选项是否受到支持。
图2-18总结了pathconf和fpathconf使用的符号常量。除了图2-5中列出的选项之外,图2-19总结了其他一些sysconf使用的未弃用的选项及它们的符号常量。注意,我们省略了与实用命令相关的选项。
如同系统限制一样,关于sysconf、pathconf和fpathconf如何处理选项,有如下几点值得注意。
(1)_SC_VERSION的返回值表示标准发布的年(以4位数表示)、月(以2位数表示)。该值可能是198808L、199009L、199506L或表示该标准后续版本的其他值。与SUSv3(POSIX.1 2001年版)相关连的值是200112L,与SUSv4(POSIX.1 2008年版)相关连的值是200809L。
(2)_SC_XOPEN_VERSION的返回值表示系统支持的XSI版本。与SUSv3相关联的值是600,与SUSv4相关的值是700。
(3)_SC_JOB_CONTROL、_SC_SAVED_IDS以及_PC_VDISABLE的值不再表示可选功能。虽然XPG4和SUS早期版本要求支持这些选项,但从SUSv3起,不再需要这些功能,但这些符号仍然被保留,以便向后兼容。
(4)符合POSIX.1-2008的平台还要求支持下列选项:
- _POSIX_ASYNCHRONOUS_IO
- _POSIX_BARRIERS
- _POSIX_CLOCK_SELECTION
- _POSIX_MAPPED_FILES
- _POSIX_MEMORY_PROTECTION
- _POSIX_READER_WRITER_LOCKS
- _POSIX_REALTIME_SIGNALS
- _POSIX_SEMAPHORES
- _POSIX_SPIN_LOCKS
- _POSIX_THREAD_SAFE_FUNCTIONS
- _POSIX_THREADS
- _POSIX_TIMEOUTS
- _POSIX_TIMERS
这些常量定义成具有值200809L。相应的_SC符号同样是为了向后兼容而被保留下来的。
(5)如果对指定的pathname或fd已不再支持此功能,那么_PC_CHOWN_RESTRICTED和_PC_NO_ TRUNC返回−1,而errno不变,在所有符合POSIX的系统中,返回值将大于0(表示该选项被支持);
(6)_PC_CHOWN_RESTRICT引用的文件必须是一个文件或者是一个目录。如果是一个目录,那么返回值指明该选项是否可应用于该目录中的各个文件。
(7)_PC_NO_TRUNC和_PC_2_SYMLINKS引用的文件必须是一个目录。
(8)_PC_NO_TRUNC的返回值可用于目录中的各个文件名。
(9)_PC_VDISABLE引用的文件必须是一个终端文件。
(10)_PC_ASYNC_IO、_PC_PRIO_IO和_PC_SYNC_IO引用的文件一定不能是一个目录。
图2-20列出了若干配置选项以及在本书所讨论的4个示例系统上的对应值。如果系统定义了某个符号常量但它的值为−1或0,但是相应的sysconf或pathconf调用返回的是−1,就表示该项未被支持。可以看到,有些系统实现还没有跟上Single UNIX Specification的最新版本。
注意,当用于Solaris PCFS文件系统中的文件时,对于_PC_NO_TRUNC,pathconf返回−1。PCFS文件系统支持DOS格式(软盘格式),DOS文件名按DOS文件系统所要求8.3格式截断,在进行此种操作时并无任何提示。