什么是 ANSI C?
ANSI C 是基本的C语言函数库,包含了C语言最基本的库函数。
1983年,美国国家标准协会(ANSI)组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,这个版本的语言经常被称作ANSI C,或有时称为C89(为了区别C99)。在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会(ANSI)采纳为ISO/IEC 9899:1990。这个版本有时候称为C90或者ISO C。综上,ANSI C、ISO C、C89、C90其实是同一种标准。
glibc 和 libc 都是 Linux 下的C函数库:
Glibc 常应用于桌面和服务器的 GNU/Linux 类的系统,都是用C语言标准库。
其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。
uClibc 是一个小型的C标准库,主要用于嵌入式 Linux 系统。
最初是为了支持 uClinux 而开发(注:uClinux不支持MMU),因此比较适用于微处理器中。而此处的u意思是μ,Micro,微小的意思。
uClibc 比一般用于 Linux 发行版的C库 GNU C Library (glibc) 要小得多, uClibc 专注于嵌入式Linux。很多功能可以根据空间需求进行取舍。
uClibc的特点:
(1)uClibc比glibc要小很多。
(2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。
(3)uClibc在可配置性上比glibc要好。
虽然 uClibc 和 Glibc 在已有的接口上是兼容的,但是 uClibc 并没有包括Glibc 中的所有接口实现,因此有些应用可能在 uClibc 中不能编译。
uClibc 并不能保证发布的库二进制兼容旧版本 uClibc 库。当一个新的版本uClibc 库被发布,则可能需要也可能不需要重新编译应用程序。
在 Glibc 中调用 malloc(0),将返回一个有效的指针,然而在 uClibc 中调用 malloc(0),则返回NULL指针。根据在 SuSv3 中关于 malloc(0) 的行为的定义,两个库的实现都是正确的。对于调用 relloc(NULL,0),两个库的实现也不同。个人感觉 Glibc 的如此实现不是特别安全。Glibc 中 malloc 的实现可以通过 MALLOC_CHECK_ 环境变量调节。这个方法主要用于 malloc 调试。这些扩展的 malloc 调试特性在 uClibc 中是不可用的。在 Linux 上有许多有些的 malloc 调试功能的库(如:dmalloc, electric fence, valgrind等)比 Glibc 中的扩展的 malloc 调试功能更好用。因此 uClibc 中去掉这些功能特性并不会有多大损失。
uClibc 没有提供用于数据接口的库 (libdb)。
uClibc 不支持 NSS(/lib/libnss_*),在这方面 Glibc 更容易支持不同方式的认证和 DNS 解析。uClibc 仅仅支持采用 flat 口令文件或者 shadow 口令文件存储授权信息。如果需要比这些更复杂的的授权,可以编译安装 pam。
uClibc 中的 libresolv 库仅仅是一个桩。Glibc 的 libresolv 库中的部分并不是全部的功能 uClibc 都提供,许多函数都没有实现。
提供网络信息服务支持(NIS)libnsl库(最初被称为黄页YP),被SUN扩展为发明为RPC并用于网络共享Unix口令文件。个人认为NIS是一个令人厌恶的东西并应该使用。因此,在实现相同的功能情况下采用ldap比NIS更有效。uClibc虽然提供一个桩libnsl,但并不支持NIS。我们因此也不提供在Glibc下提供的位于/usr/include/rpcsvc里的头文件。
uClibc 的区域支持并不是100%的完全。正在这方面努力
uClibc 的数据功能函数库内部仅仅支持 long double,设置对于 long double 的支持也是非常有限。与此对应的只实现了较少的数学函数。如果应用程序采用 double 类型,则会程序会运行得较好。
uClibc 的 libcrpt 库不支持可重入 crypt_r, setkey_r 和 encrypt_r,因为这些也不是 SuSv3 所规定的。
uClibc 直接采用内核的数据类型去定义大多数透明的数据类型。
uClibc 支持采用 Linux 内核结构特有的结构体 “struct stat”。
uClibc 的运行时库 librt 当前缺少 aio 接口、全部的时钟接口和共享内存接口(仅仅实现定时器接口和消息队列接口)
可以简单的理解为:
glibc,uClibc 都是C语言函数库: