手册页部分 5: 标准、环境和宏

退出打印视图

更新时间: 2014 年 7 月
 
 

POSIX(5)

名称

standards , ANSI , C , C++ , ISO , POSIX , POSIX.1 , POSIX.2 , SUS , SUSv2 , SUSv3 , SVID , SVID3 , XNS , XNS4 , XNS5 , XPG , XPG3 , XPG4 , XPG4v2 - Oracle Solaris 支持的标准和规范

描述

Oracle Solaris 支持 IEEE 标准 1003.1 和 IEEE 标准 1003.2(通常分别称为 POSIX.1 和 POSIX.2)。下表列出了这些标准的每个版本及其简要说明,以及最先遵从这些标准的 SunOS 或 Solaris 发行版。

POSIX 标准
说明
发行版
POSIX.1-1988
系统接口和系统头
SunOS 4.1
POSIX.1-1990
POSIX.1-1988 更新
Solaris 2.0
POSIX.1b-1993
实时扩展
Solaris 2.4
POSIX.1c-1996
线程扩展
Solaris 2.6
POSIX.2-1992
shell 和实用程序
Solaris 2.5
POSIX.2a-1992
交互式 shell 和实用程序
Solaris 2.5
POSIX.1–2001
POSIX.1-1990、POSIX.1b-1993、POSIX.1c-1996、POSIX.2-1992 和 POSIX.2a-1992 更新
Solaris 10
POSIX.1-2004
POSIX.1-2001 更新
Oracle Solaris 11

Oracle Solaris 还支持 X/Open Common Applications Environment (CAE) Portability Guide Issue 3 (XPG3) 和 Issue 4 (XPG4)、单一 UNIX 规范(Single UNIX Specification,SUS,亦称为 XPG4v2)、单一 UNIX 规范版本 2 (Single UNIX Specification, Version 2, SUSv2) 以及单一 UNIX 规范版本 3 (Single UNIX Specification, Version 3, SUSv3)。XPG4 和 SUS 均包括 Networking Services Issue 4 (XNS4)。SUSv2 包括 Networking Services Issue 5 (XNS5)。

下表列出了每个 X/Open 规范及其简要说明,以及最先遵从这些标准的 SunOS 或 Solaris 发行版。

X/Open CAE
规范
说明
发行版
XPG3
POSIX.1-1988 的超集,包含 SVID3 中的实用程序
SunOS 4.1
XPG4
POSIX.1-1990、POSIX.2-1992 和 POSIX.2a-1992 的超集,包含从 XPG3 到 POSIX 标准的扩展
Solaris 2.4
SUS (XPG4v2)
XPG4 的超集,包含常见应用程序软件包广泛使用的旧式 BSD 接口
Solaris 2.6
XNS4
套接字和 XTI 接口
Solaris 2.6
SUSv2
SUS 的超集,已扩展为支持 POSIX.1b-1993、POSIX.1c-1996 和 ISO/IEC 9899(C 标准)修订 1
Solaris 7
XNS5
XNS4 的超集和干净的 LP64 派生接口。
Solaris 7
SUSv3
与 POSIX.1–2001 相同
Solaris 10

XNS4 规范只有在 ILP32(32 位)环境中使用才是安全的,不应该用于 LP64(64 位)应用程序环境。在这种环境中,应使用 XNS5 或 SUSv3,XNS5 或 SUSv3 具有可在 ILP32 和 LP64 环境中移植的干净的 LP64 接口。Solaris 发行版 7 到 Oracle Solaris 11 支持 ILP32 和 LP64 两种环境。

Solaris 发行版 7 到 10 标为符合 The Open Group 的 UNIX 98 产品标准。Solaris 10 到 Oracle Solaris 11 标为符合 The Open Group 的 UNIX 03 产品标准。

Solaris 发行版 2.0 到 Oracle Solaris 11 支持 System V 接口定义第 3 版的卷 1 至卷 4 (SVID3) 指定的接口。然而请注意,由于此规范的开发者 (UNIX Systems Laboratories) 已不再运营并且此规范遵从 POSIX 和 X/Open CAE 规范,因此对符合此规范当前所要达到的要求有一些分歧。

安装 Oracle Solaris Studio 12.3 C 编译器后,Oracle Solaris 11 即支持 ANSI X3.159-1989 编程语言 - C 和 ISO/IEC 9899:1990 编程语言 - C (C) 接口。

安装 Oracle Solaris Studio 12.3 C 编译器后,Oracle Solaris 11 即支持 ISO/IEC 9899:1990 修订 1:1995: C Integrity。

安装 Oracle Solaris Studio 12.3 C 编译器后,Oracle Solaris 11 即支持 ISO/IEC 9899:1999 编程语言 - C。

安装 Oracle Solaris Studio 12.3 C++ 编译器后,Oracle Solaris 11 即支持 ISO/IEC 14882:1998 编程语言 - C++。编译器自述文件中介绍了该标准不支持的功能。

实用程序

如果 POSIX.2、POSIX.2a、XPG4、SUS 或 SUSv2 要求的行为与旧式 Solaris 实用程序行为冲突,将不会更改实用程序的原始 Solaris 版本;/usr/xpg4/bin 中提供了符合标准的新版本。如果 POSIX.1–2001 或 SUSv3 要求的行为与旧式 Solaris 实用程序行为冲突,/usr/xpg4/bin/usr/xpg6/bin 中提供了符合标准的新版本。如果 POSIX.1–2001 或 SUSv3 要求的行为与 POSIX.2、POSIX.2a、SUS 或 SUSv2 冲突,/usr/xpg6/bin 中提供了符合 SUSv3 标准的新版本。

如果应用程序要使用符合标准的实用程序,则必须设置 PATHsh(1)ksh(1))或者 path (csh(1)) 环境变量,以指定顺序指定下列目录来获取相应的实用程序:

SVID3、XPG3
  1. /usr/bin

  2. 包含编译器的二进制文件的目录

  3. 包含应用程序所需的二进制文件的其他目录

POSIX.2、POSIX.2a、SUS、SUSv2、XPG4
  1. /usr/xpg4/bin

  2. /usr/bin

  3. 包含编译器的二进制文件的目录

  4. 包含应用程序所需的二进制文件的其他目录

POSIX.1–2001、SUSv3
  1. /usr/xpg6/bin

  2. /usr/xpg4/bin

  3. /usr/bin

  4. 包含编译器的二进制文件的目录

  5. 包含应用程序所需的二进制文件的其他目录

当应用程序使用 execlp()execvp()(请参见 exec(2))来执行 shell 文件或使用 system(3C) 时,用于解释 shell 文件的 shell 取决于调用者遵循的标准:

标准
使用的 Shell
1989 ANSI C、1990 ISO C、1999 ISO C、POSIX.1 (1990–2001)、SUS、SUSv2、SUSv3、XPG4
/usr/xpg4/bin/sh
POSIX.1 (1988)、SVID3、XPG3 或未指定标准
/usr/bin/sh

功能测试宏

功能测试宏供应用程序用来指示用户需要的 C 标准指定的那些功能之外的其他功能集。如果应用程序仅使用特定标准(如 POSIX 或 X/Open CAE)定义的接口和头,则仅需要定义该标准指定的相应功能测试宏。如果应用程序要使用该标准未定义的接口和头,则除了定义相应的标准功能测试宏之外,还必须定义 __EXTENSIONS__。通过定义 __EXTENSIONS__,应用程序便可以访问与指定的标准不冲突的所有接口和头。应用程序必须在编译命令行或应用程序源文件中定义 __EXTENSIONS__

1989 ANSI C、1990 ISO C、1999 ISO C

无需定义功能测试宏来指示应用程序符合 C 标准。

ANSI/ISO C++

ANSI/ISO C++ 未定义任何功能测试宏。如果编译器根据编译器缺省值和命令行选项预定义的标准 C++ 声明宏 __cplusplus 设置为 199711 或更大值,则编译器会以符合标准的模式运行,并指示符合 C++ 标准。值 199711 指示符合该标准要求的 ISO/IEC 14882:1998。(如上所述,该标准的符合性并不完整。)

未针对 POSIX 或 X/Open CAE 定义 C++ 绑定,因此指定功能测试宏(如 _POSIX_SOURCE_POSIX_C_SOURCE_XOPEN_SOURCE)会由于与 C++ 标准和其他规范的要求冲突而导致编译错误。

POSIX

要符合 POSIX.1 的应用程序必须在加入任何头之前定义该标准指定的功能测试宏。对于以下列出的标准,应用程序必须定义所列出的功能测试宏。应用程序编写者必须在对应的标准中查找其他可查询的宏,以确定实现是否支持所需的选项。

POSIX 标准
功能测试宏
POSIX.1-1990
_POSIX_SOURCE
POSIX.1-1990 和 POSIX.2-1992 C 语言绑定选项
_POSIX_SOURCE_POSIX_C_SOURCE=2
POSIX.1b-1993
_POSIX_C_SOURCE=199309L
POSIX.1c-1996
_POSIX_C_SOURCE=199506L
POSIX.1–2001
_POSIX_C_SOURCE=200112L
SVID3

SVID3 规范未指定任何功能测试宏用于指示编写的应用程序符合 SVID3 要求。SVID3 规范是在 C 标准完成之前编写的。

X/Open CAE

要构建或编译符合 X/Open CAE 规范之一的应用程序,请遵循以下准则。如果应用程序同时需要 CAE 和 POSIX 功能,则不需要设置 POSIX 功能测试宏。

XPG3

应用程序必须定义 _XOPEN_SOURCE。如果 _XOPEN_SOURCE 定义了值,该值必须小于 500。

XPG4

应用程序必须定义 _XOPEN_SOURCE 并设置 _XOPEN_VERSION=4。如果 _XOPEN_SOURCE 定义了值,该值必须小于 500。

SUS (XPG4v2)

应用程序必须定义 _XOPEN_SOURCE 并设置 _XOPEN_SOURCE_EXTENDED=1。如果 _XOPEN_SOURCE 定义了值,该值必须小于 500。

SUSv2

应用程序必须定义 _XOPEN_SOURCE=500

SUSv3

应用程序必须定义 _XOPEN_SOURCE=600

编译

Oracle Solaris Studio 12.3 C 编译器提供符合 ISO/IEC 99899:1999(1999 ISO C 语言)标准的编译系统以及 c99 实用程序。

ld 直接用于链接应用程序时,必须在任何 link/load 命令行中指定 /usr/lib/values-xpg4.o,除非应用程序符合 POSIX.1–2001 或 SUSv3,在这种情况下必须在任何 link/load 编译行中指定 /usr/lib/values-xpg6.o。将 ccCC 用于链接应用程序时,编译器会自动添加相应的文件。但是,构建应用程序的首选方法如下表所述。

符合 XNS4 或 XNS5 的应用程序必须在任何 link/load 命令行中包括 –l XNS,并且要分别定义针对 SUS 或 SUSv2 指定的功能测试宏。

如果编译器支持 redefine_extname pragma 功能(Oracle Solaris Studio 12.3 C 编译器和 Oracle Solaris Studio 12.3 C++ 编译器定义了 __PRAGMA_REDEFINE_EXTNAME 宏来指示它们支持此功能),则标准头会使用 #pragma redefine_extname 指令将函数名称正确映射到库入口点名称。此映射完全支持 ISO C、POSIX 和 X/Open 名称空间保留项。

如果编译器不支持此 pragma 功能,则标准头会使用 #define 指令将内部函数名称映射到相应的库入口点名称。在这种情况下,应用程序应避免显式使用 lf64(5) 手册页上列出的 64 位文件偏移符号,因为实现会使用这些名称来命名替代的入口点。

使用 Oracle Solaris Studio 12.3 C 编译器时,符合以上所列规范的应用程序应使用下表中指出的实用程序和标志进行编译:

Specification            Compiler/Flags         Feature Test Macros
_________________________________________________________________________
1989 ANSI C and 1990 ISO C    c89                none
_________________________________________________________________________
1999 ISO C                    c99                none
_________________________________________________________________________
SVID3                         cc -Xt -xc99=none  none
_________________________________________________________________________
POSIX.1-1990                  c89                _POSIX_SOURCE
_________________________________________________________________________
POSIX.1-1990 and POSIX.2-1992 c89                _POSIX_SOURCE  and
  C-Language Bindings Option                     POSIX_C_SOURCE=2
_________________________________________________________________________
POSIX.1b-1993                 c89                _POSIX_C_SOURCE=199309L
_________________________________________________________________________
POSIX.1c-1996                 c89                _POSIX_C_SOURCE=199506L
_________________________________________________________________________
POSIX.1-2001                  c99                _POSIX_C_SOURCE=200112L
_________________________________________________________________________
POSIX.1c-1996                 c89                _POSIX_C_SOURCE=199506L
_________________________________________________________________________
CAE XPG3                      cc -Xa -xc99=none  _XOPEN_SOURCE
_________________________________________________________________________
CAE XPG4                      c89                _XOPEN_SOURCE and
                                                 _XOPEN_VERSION=4
_________________________________________________________________________
SUS (CAE XPG4v2)              c89                _XOPEN_SOURCE and
  (includes XNS4)                                 _XOPEN_SOURCE_EXTENDED=1
_________________________________________________________________________
SUSv2 (includes XNS5)         c89                _XOPEN_SOURCE=500
_________________________________________________________________________
SUSv3                         c99                _XOPEN_SOURCE=600

对于支持 LP64(64 位)编程环境的平台,应使用以下格式的命令行来构建符合 SUSv2 的使用 XNS5 库调用的 LP64 应用程序:

c89 $(getconf XBS5_LP64_OFF64_CFLAGS) -D_XOPEN_SOURCE=500 \
    $(getconf XBS5_LP64_OFF64_LDFLAGS) foo.c -o foo \
    $(getconf XBS5_LP64_OFF64_LIBS) -lxnet

应使用以下格式的命令行来构建符合 SUSv3 的类似 LP64 应用程序:

c99 $(getconf POSIX_V6_LP64_OFF64_CFLAGS) -D_XOPEN_SOURCE=600 \
    $(getconf POSIX_V6_LP64_OFF64_LDFLAGS) foo.c -o foo \
    $(getconf POSIX_V6_LP64_OFF64_LIBS) -lxnet
SUSv3
c99

_XOPEN_SOURCE=600

另请参见

csh(1)ksh(1)sh(1)exec(2)sysconf(3C)system(3C)environ(5)lf64(5)