glibc移值的特性测试宏
阅读数:107 评论数:0
跳转到新版页面分类
C/C++
正文
一、概述
对于glibc来讲,除了C语言标准之外,还包含了posix、systemV等特性。为此,glibc针对不同的标准有特定的宏定义,用于指定当前代码所遵循的标准和版本,这些宏定义被称为特性测试宏。
1、C语言标准
主要包含C89(1989年最初始的ANSI C版本)、C99(1999)、C11(2011)和C17(2017)。
2、BSD、SystemV
Unix操作系统在操作风格上主要分为SystemV和BSD,
(1)BSD(伯克利软件发布版,Berkeley Software Distribution)最初是加州大学伯克利分校1979年发布的unix版本,包括了C shell,vi等功能. 由此演化成BSD的标准.
(2)SystemV
AT&T1983年发布了unix系统System III,并于1989发布了System V.通过对其它厂商的使用授权使其逐渐成为很多unix功能实现的基础。其中第四个发行版本SVR4是最成功的版本。
|
Sytem V | BSD |
Root脚本位置 | /etc/init.d | /etc/rc.d |
默认Shell | Bshell | Cshell |
文件系统数据 | /etc/mnttab | /etc/mtab |
内核位置 | /UNIX | /vmUnix |
打印机设备 | lp | rlp |
字符串函数 | memcopy | bcopy |
终端初始化设置文件 | /etc/initab | /etc/ttys |
终端控制 | termio | termios |
3、Posix、SystemV
SystemV及Posix对信号量、共享内存、消息队列等进程之间共享方式提供了自己的解决方案。
(1)POSIX
Portable Operating System Interface for Computing Systems,描述了操作系统的调用接口。
先是称为IEEE标准,之后又被ISO采纳,因此POSIX.1为ISO/IEC 9945-1:1990. 之后陆续升级了命令与工作标准(POSIX.2)、测试方法标准(POSIX.3)、实时 API(POSIX.4)等.
(2)ipc对比
与System V对象类似,posix ipc对象的属主、组及其他用户具有读取和写入权限,但是没有执行权限,ipc对象属主无法将对象分配给其他属主。
与system v ipc接口不,posix ipc接口均为多线程安全接口。
posix在无竞争条件下,不需要陷入内核,其实现是非常轻量级的,systemv无论有无竞争都要执行系统调用,性能相对差一些,但是因为systemv ipc存在时间比较老,所以许多系统都支持,同时其接口复杂,各平台实现可能略有区别。
4、X/Open和XPG3
X/Open公司是由多家国际计算机厂商所组成的联盟(The Open Group) ,基于POSIX的开放系统标准。包含XPG3(1989), XPG4(1992). 其接口成为XSI(X/Open System Interface).
之后经过AT&T公司等一些列转让, X/Open又将XPG4版本2“重新包装”为SUS(Single UNIX Specification)(即SUSv1)或称之为UNIX95。其内容包括:XPG4版本2,X/Open Curses规范第4号版本2,以及X/Opena联网服务(XNS)规范第4号。
SUS版本2(SUSv2,http://www.unix.org/version2/online.html)于1997年发布。
5、SUSv3
2001年, IEEE , The Open Group和ISO委员会共同成立奥斯汀公共标准工作组(Austin CSRG), 批准了POSIX 1003.1-2001,成为ISO/IEC 9945:2002,该标准取代了之前的POSIX版本,被称为 SUSv3. 包含了基本定义, 系统接口, shell和其他工具等内容, 成为POSIX的超集.
SUSv3规范可在线获得,网址是http://www.unix.org/version3/online.html。通过SUSv3认证的UNIX实现可被称为UNIX 03。
至此, ANSI C, POSIX, XPG等标准实现了统一. 并在2008年发布了 POSIX.1-2008/SUSv4,或者称为(2008,Austin CSRG)
二、特性测试宏
由上述,每个标准的内容和接口都有差异,有的是新添的,也有的在新标准中已经废弃,因此在移植过程中,我们需要指定我们当前代码使用的具体标准,指定方式就是在包含头文件之前,定义相关的特性测试宏,比如
#define _XOPEN_SOURCE
或者添加编译选项
gcc -D_POSIX_SOURCE hello.c
1、glibc具体支持的标准如下
(1)_POSIX_SOURCE
头文件会遵从POSIX.1-1990和ISO C(1990)标准的定义,该宏已被__POSIX_C_SOURCE取代。
(2)_POSIX_C_SOURCE
若定义为1,效果与_POSIX_SOURCE相同。
>=199309,=POSIX.1b
>=199506,=POSIX.1c
=200112,=POSIX.1-2001
=200909,=POSIX.1-2008
(3)_BSD_SOURCE
开启对BSD定义的支持,只要定义了该宏,便定义了_POSIX_C_SOURCE值为199506
(4)SVID_SOURCE
头文件遵从SystemV接口规范SVID
(5)_GNU_SOURCE
头文件除了指定前面所有标准的定义外,还会开启对各种GNU扩展定义的支持。
(6)_XOPEN_SOURCE POSIX.1/SUS
SUSv3明文规定,将_XOPEN_SOURCE设置为600时,就包含了将POSIX_C_SOURCE设置为200112时所有特性