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时所有特性

 

 




相关推荐

struct buffer{int data_len; //长度ch

1、指定cmake的最小版本 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 这行命令是可选的,也可以不写这句话,但如果CMa

在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享。在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变。类似的问题还存在于fputs之类的函数中,

写程序大体步骤为: 1.用编辑器编写源代码,如.c文件。 2.用编译器

C语言允许用户使用typedef关键字来定义自己习惯的数据类型名称。 typedef的4种用法 1、为基本数据类型定义新的类型名 系统默认的所有基本

修饰变量的声明 例如: 若a.c中需要用b.c中的变量 int v,可以在a.c中声明extern int v,然后就可以引用变量v。能够被其他模块extern引用到的变量通常是全局变量。 还有一点是

第1章 认识对象 1.面向对象分析(object-oriented analysis,OOA)的主要任务是分析问题域中的对象、对象之间的关系,然后构造出该问题域的分析模型。分析

第一章 C++初步认识 C++对C的&ldquo;增强&rdquo;,表现在两个方面: (1)在原来面向过程的机制基础上,对C语言的功能做了不少扩展 <p

有一种特殊的指针叫做成员指针,它们通常指向一个类的成员,而不是对象中成员的特定实例。 <span styl

C++标准每5年会有一个新版本,1998年的C++98、2003年的C++03、2007年的C++TR1、2011年的C++11. 转换操作符 static_ca