分类: 系统运维
2012-03-27 17:48:24
我们之前看过了一个POSIX.1的可选项列表,而且讨论过XSI的可选项组。如果我们要写需要选项被支持的特性的可移植的程序,我们需要一个可移植的方法来决定某个系统实现是否支持该选项。
和前面提到的限量一样,单一UNIX规范定义了三种方法来实现:
1、编译期选项,定义在
2、运行期选项,由sysconf函数得到,与特定文件或目录无关;
3、运行期选项,通过pathconf或fpathconf函数得到,与特定文件或目录有关。
可选项包含了前面在“POSIX可选接口列表”的选项,还包含了下面两个表列出的符号:
可选项以及对应sysconf的参数名 | ||
可选项名 | 描述 | 参数名 |
_POSIX_JOB_CONTROL | 指出实现是否支持job控制 | _SC_JOB_CONTROL |
_POSIX_READER_WRITER_LOCKS | 指出实现是否支持读写锁 | _SC_READER_WRITER_LOCKS |
_POSIX_SAVED_IDS | 指出实现是否支持保存的set-user-ID和保存的set-gropu-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 | 指出实现是否支持XSI实时线程可选项组 | _SC_XOPEN_REALTIME_THREADS |
_XOPEN_VERSION | 指出XSI的版本 | _SC_XOPN_VERSION |
可选项以及对应的pathconf和fpathconf参数 |
||
可选项名 |
描述 |
参数名 |
_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 |
如果符号常量没有定义,我们必须使用syncconf、pathconf或fpathconf来确定这个可选项是否被支持。在这种情况下,函数的命名参数
由替换符号名前的_POSIX为_SC或_PC而成。对于那些以_XOPEN开头的符号,命名参数必须在其之前添加_SC或_PC前缀,而非替换它。比
如,如果常量_POSIX_THREADS没有定义,那我们以_SC_THREADS为参数调用sysconf来知道系统是否支持POSIX线程选项。如
果常量_XOPEN_UNIX没有定义,我们可以用命名参数_SC_XOPEN_UNIX命名参数调用sysconf来知道系统是否支持XSI扩展。
如果符号常量有定义,则有三种可能性:
1、定义的值为-1,表示系统不支持该选项;
2、定义的值大于0,表示该选项被支持;
3、定义的值等于0,则我们必须调用sysconf、pathconf或fpathconf来决定这个值是否被支持。
和系统限量一样,根据sysconf、pathconf和fpathconf如何对待可选项,有几点需要注意的地方:
1、_SC_VERSION的返回值表明标准的4个数字的年份和2个数字的月份。这个值可以是198808L、199009L、199506L或一些其它可新版本标准的值。与SUS好v3相关的值为201112L。
2、_SC_XOPEN_VERSION的返回值表明系统编译的XSI版本。对应的SUSv3的值为600;
3、_SC_JOB_CONTROL、SC_SAVED_IDS和_PC_VDISABLE不再是可选的特性。从SUSv3开始,这些特性是必需的,尽管为了向后兼容这些符号仍被保留;
4、_PC_CHOWN_RESTRICTED和_PC_NO_TRUNC返回-1,但不改变errno的值,如果指定的路径名或域不支持该选项;
5、_PC_CHOWN_RESTRICTED相关的文件必须是文件或目录。如果是目录,返回值表明选项是否应用在该目录下的所有文件;
6、_PC_NO_TRUNC的相关文件必须是一个目录。返回值应用于该目录下的所有文件;
7、_PC_VDISABLE相关文件必须是一个终端文件。
在下表我们展示几个配置可选项以及它们在样例系统上的对应值。注意有些系统没有跟上SUS的最新版本。比如Mac OS X10.3支持POSIX线程,但把_POSIX_THREADS定义为:
#define _POSIX_THREADS
而没有任何的值。根据SUSv3,符号如果定义的话,其值必须为-1、0或200112。
配置可选项的例子 | |||||
限量 | FreeBSD 5.2.1 | Linux 2.4.22 | Mac OS X 10.3 | Solaris 9 | |
UFS文件系统 | PCFS文件系统 | ||||
_POSIX_CHOWN_RESTRICTED | 1 | 1 | 1 | 1 | 1 |
_POSIX_JOB_CONTROL | 1 | 1 | 1 | 1 | 1 |
_POSIX_NO_TRUNC | 1 | 1 | 1 | 1 | 不支持 |
_POSIX_SAVED_IDS | 不支持 | 1 | 不支持 | 1 | 1 |
_POSIX_THREADS | 200112 | 200112 | 有定义 | 1 | 1 |
_POSIX_VDISABLE | 255 | 0 | 255 | 0 | 0 |
_POSIX_VERSION | 200112 | 200112 | 198808 | 199506 | 199506 |
_XOPEN_UNIX | 不支持 | 1 | 无定义 | 1 | 1 |
_XOPEN_VERSION | 不支持 | 500 | 无定义 | 3 | 3 |
标记为“无定义”的项表示这个特性没有定义,也就是说,系统没有定义这个符号常量,也没有相应的_PC或_SC参数名。相反,“有定义”的项表示符号常量
被定义,但没有值,比如之前提到的_POSIX_THREADS。一个“不支持”的项表明系统定义了这个符号常量,但它的值为-1,或者它的值为0但对应
的sysconf和pathconf调用的返回值为-1。
注意在Solaris上的PCFS文件系统上,_PC_NO_TRUNC的pathconf调用返回-1。PCFS文件系统支持(软盘的)DOS格式,而根据DOS文件系统的需求,DOS文件名都静默地转换为8.3的格式。