Oracle Solaris 支持 IEEE 标准 1003.1 和 IEEE 标准 1003.2(通常分别称为 POSIX.1 和 POSIX.2)。下表列出了这些标准的每个版本及其简要说明,以及最先遵从这些标准的 SunOS 或 Solaris 发行版。
|
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 发行版。
|
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 标准的新版本。
如果应用程序要使用符合标准的实用程序,则必须设置 PATH(sh(1) 或 ksh(1))或者 path (csh(1)) 环境变量,以指定顺序指定下列目录来获取相应的实用程序:
/usr/bin
包含编译器的二进制文件的目录
包含应用程序所需的二进制文件的其他目录
/usr/xpg4/bin
/usr/bin
包含编译器的二进制文件的目录
包含应用程序所需的二进制文件的其他目录
/usr/xpg6/bin
/usr/xpg4/bin
/usr/bin
包含编译器的二进制文件的目录
包含应用程序所需的二进制文件的其他目录
当应用程序使用 execlp() 或 execvp()(请参见 exec(2))来执行 shell 文件或使用 system(3C) 时,用于解释 shell 文件的 shell 取决于调用者遵循的标准:
|
功能测试宏供应用程序用来指示用户需要的 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 的应用程序必须在加入任何头之前定义该标准指定的功能测试宏。对于以下列出的标准,应用程序必须定义所列出的功能测试宏。应用程序编写者必须在对应的标准中查找其他可查询的宏,以确定实现是否支持所需的选项。
|
SVID3 规范未指定任何功能测试宏用于指示编写的应用程序符合 SVID3 要求。SVID3 规范是在 C 标准完成之前编写的。
X/Open CAE要构建或编译符合 X/Open CAE 规范之一的应用程序,请遵循以下准则。如果应用程序同时需要 CAE 和 POSIX 功能,则不需要设置 POSIX 功能测试宏。
应用程序必须定义 _XOPEN_SOURCE。如果 _XOPEN_SOURCE 定义了值,该值必须小于 500。
应用程序必须定义 _XOPEN_SOURCE 并设置 _XOPEN_VERSION=4。如果 _XOPEN_SOURCE 定义了值,该值必须小于 500。
应用程序必须定义 _XOPEN_SOURCE 并设置 _XOPEN_SOURCE_EXTENDED=1。如果 _XOPEN_SOURCE 定义了值,该值必须小于 500。
应用程序必须定义 _XOPEN_SOURCE=500。
应用程序必须定义 _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。将 cc 或 CC 用于链接应用程序时,编译器会自动添加相应的文件。但是,构建应用程序的首选方法如下表所述。
符合 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) -lxnetSUSv3
_XOPEN_SOURCE=600
csh(1)、ksh(1)、sh(1)、exec(2)、sysconf(3C)、system(3C)、environ(5)、lf64(5)