Linux C的一些名称等解释

POSIX:Portable Operating System Interface(可移植的操作系统接口),x与unix的x同义

System V与BSD:是unix分裂出来的2个分支

linux下通过shell来确定glibc的版本:
1、/lib/libc.so.6(路径看具体环境而定)
2、ldd myprog|grep libc(myprog是可动态可执行文件)

通过c代码来获得所安装的glibc版本:

 #include <gnu/lib-version.h>
const char* gnu_get_libc_version(void); 

或者,在glibc2.0开始,glibc定义了2个常量:__GLIBC__和__GLIBC_MINOR__。在glibc2.12版本的系统上,这2个常量的值分别为2和12

特性测试宏的介绍:
_POSIX_SOURCE:值经定义,头文件会线路出符合POSIX.1-1990和ISO C(1990)标准定义
_POSIX_C_SOURCE:若定义为1,效果与_POSIX_SOURCE效果相同。若将其值定义为大于等于199309,则头文件还会线路遵从POSIX.1b(实时)标准的定义等。
_BSD_SOURCE:开启对BSD定义支持
_GNU_SOURCE:经定义,头文件除了会显露符合前述所有标准的定义外,还会开启对各种GNU扩展定义支持
_SUID_SOURCE:经定义,头文件会显露符合System V接口规范的定义

通过gcc之类的编译命令,加上-D的选项,就可以启用这些宏了,如:GCC -D_POSIX_C_SOURCE=199506 -D_BSD_SOURCE xxx.c

 

在调用系统接口的时候,时不时会看到有类似xxx_t的变量定义,如pid_t,size_t ,uid_t等,很多也都是用c的基本类型,如int或long,但直接赋值给c的基本类型,会出现移植性问题
1、随着unix的实现不同(如long类型在A系统是4字节,在B系统是8字节),有时甚至是同一实现中编译环境的不同,这些基本类型的大小各不相同。更有甚者,不同的实现可能会使用不同类型来表示相同信息。如,进程id在A系统是int类型,在B系统是long类型:
2、即使是针对同一款操作系统的实现,用以表征信息的类型在不同版本之间也会有所不同。linux上较为知名的例子是用户id和组id。在linux2.2及其之前,这些值是16位表示。在2.4及之后,则用32位表示