Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798191
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

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的格式。


阅读(1059) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~