linux下的各种函数库略读(POSIX C和ANSI C、GNU C以及ISO C、glib、libc、glibc)

来源:互联网 发布:四大网络交流平台 编辑:程序博客网 时间:2024/05/19 07:27

glibc

  glibcgnu发布的libc库,也即c运行库。

  glibclinux系统中最底层的api(应用程序开发接口),

  几乎其它任何的运行库都会依赖于glibc

  glibc除了封装linux操作系统所提供的系统服务外,

  它本身也提供了许多其它一些必要功能服务的实现,主要的如下:

  (1string,字符串处理

  (2signal,信号处理

  (3dlfcn,管理共享库的动态加载

  (4direct,文件目录操作

  (5elf,共享库的动态加载器,也即interpreter

  (6iconv,不同字符集的编码转换

  (7inetsocket接口的实现

  (8intl,国际化,也即gettext的实现

  (9io

  (10linuxthreads

  (11locale,本地化

  (12login,虚拟终端设备的管理,及系统的安全访问

  (13malloc,动态内存的分配与管理

  (14nis

  (15stdlib,其它基本功能

  GLIBC的内容

  由于glibc囊括了几乎所有的UNIX通行的标准(比如systemVPOSIX标准,glibc都是包括的),可以想见其内容包罗万有。而就像其他的UNIX系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个作业系统。以glibc-2.2为例,这些档案群主要包括:

  1.分享函式库群:.so为共享函数库)

   这是glibc的主体,分布/lib/usr/lib 中,包括libc标准C 函式库、libm数学函式库、libcrypt加密与编码函式库、libdb资料库函式库、libpthread行程多执行绪函式库、libnss 网路服务函式库等等。这些都是可分享函式库,档名都以.so 做结尾。其中,/lib/ld*.so是程式与函式库连结的工具。有的用于程式编译时将程式与函式库内的函式物件连结,在只支援静态连结的系统中,此连结方式就是直接将所需的物件自函式库中抽出c程式的可执行档相连,而在支援可分享函式库的系统中,在程式编译时期的连结只是在执行档中纪录了那些函式物件是存在那个函式库档案中,等该程式开始执行时,则由另一个负责动态连结的ld*.so将所需的函式库连结好执行

  一般而言,负责程式编译时期的连结器档名为ld.so,而负责程式执行时的动态连结器档名为ld-.so ld-linux.so (GNU/Linux系统中)

  函式库标头档与程式开发元件:

  这些标头档档名都以.h为结尾,全部在/usr/include/底下,其内容为函式库中各函式的宣告、巨集定义、资料物件的型别等等,这些都是程式开发者不可或缺的部分。

  除此之外,在/usr/lib/ 中还有若干.o.a的档案,这些是程式编译过程中要连结为可执行档时所需的元件,有些则为上述可分享函式库的静态连接版本,而后者可以在某些特殊场合下需要静态连结程式时使用。

  函式库说明文件:

  在一般的UNIX 系统下,这些说明文件是放在/usr/man/usr/share/man底下,统称为manpages,其底下还分若干章节,其中第二章(man2)讲的是系统呼叫而第三章(man3)讲的就是libc标准函式库,这些都是系统开发者重要的参考资料。

  而在GNU的系统中,除了manpages 之外,还有一套称为 info的文件资料系统,而且里头的说明往往比man pages还要详尽,这在glibc中也不例外。Glibcinfo文件位于/usr/share/info/libc.info* ,本文中有许多素材就是取自这些文件的内容。

  字集转换模组与区域化资料库:

  这些是与程式国际化与本土化相关的部分,主要可分成四大块:/usr/lib/gconv/内含大量的字集转换模组,大部分是各种字集及编码方式与系统的基底字集之间的转换。第二块是/usr/lib/locale,内含以系统基底字集写成的区域化资料库(locale),像是LC_CTYPELC_TIME等等。第三块是/usr/share/locale/,内含可跨平台使用的区域化资料,主要是各应用程式的?息翻译部分。而最后一块是/usr/share/i18n/,其内容是各区域化资料库的原始码,以及系统支援的内码对应表等等。

  时区资料库:

  主要分别在/usr/share/zoneinfo 底下,内含世界各地时区与格林威治时间的转换资料。

  其他工具程式与设定档:

  工具程式分言/usr/bin/sbin底下,包括一些转码与区域化资料库相关的程式如iconv, locale,localedef等,以及用?@示应用程式与可分享函式库相依关系的ldd, 还有可分享函式库搜寻路?焦芾沓淌ldconfig等。而其相关的设定档则位于/etc 底下。

  disaos

  03-11-03,10:42

  GLIBC的规格

   在GNU/Linux系统中,其C函式库的发展史点出了GNU/Linux 演进的几个重要里程碑,由此可以突显出C 函式库在系统中的地位与重要性。早期的GNU/Linux 系统?K不支援可分享函式库,因此所有的应用程式都是以静态连结的方式存于系统中。直到1995-1996libc5问世以后,系统才开始支援ELF 可分享函式库,同时该版的C函式库也作了其他UNIX 上大部分的功能与函式群,可谓GNU/Linux 发展上的一大进步。

  然而libc5在程式国际化(I18N)与本土化(L10N) 方面的支援很差,故那个时候若要开发所谓中文化的程式,就非得自行作一套标准不可。直到一两年后,GNU/Linux换用了GNU所开发的glibc-2.0 做为其C函式库后,其国际化与本土化的支援才开始起步,后?vglibc-2.1,到了现在的2.2版,整个多国语文的开发环境才大至成熟。

  用glibc做为系统的C函式库,是GNU/Linux 演进的一个重要里程碑。在GNU的计画中,开发glibc 原本是要给他们尚未问世的核心GNU/Hurd 用的,由于当时几乎 99%GNU系统工具已开发完成,就独缺核心Hurd(内核kernel),而恰巧Linux核心在Torvalds的带领下已逐?u成熟稳定,而且可以顺利执行所有的GNU 系统工具。故GNU团队便顺应Linux核心的特性,改写了他们的glibc,使其可以适用于Hurd核心与Linux 核心。如此,在这两个平台上就有了一致的程式开发环境,使得所有的GNU程式可以在这两个平台之间顺利移植。

  比起过去的libc5glibc系列(一般又称之为libc6)除了有完整的国际化与本土化支援外,同时还符合许多标准与规格,使得在glibc下开发的程式可以很容易移植到其他UNIX平台去。这些标准包括:

(以下都是glibc支持的规范)


  ISOC:

  ISO CInternationalStandardfor the C programming language的缩写,此标准明定了C语言的语法,标准C函式库应具备那些标头档、巨集定义、函式与物件等等,几乎在任何平台上的C语言(包括非UNIX平台)都支援此标准。这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。 后来被 ISO(国际标准化组织)接受为标准,因此也称为 ISO C。

  POSIX:

  POSIXPortableOperatingSystem Interface for Computer Environments的缩写,它是ISOC的延伸,明定了一个可移植的作业系统所应具备种种条件,其范围不只有系统函式库而已,还同时包括一些标准的工具程式、系统核心应有的特色与?作、以及在C函式库中某些与作业系统相关的低阶控制支援(如系统呼叫窗口)等等。由于glibc是完全按照POSIX的标准制作的,同时搭配了符合POSIX 标准的Linux核心,故在此环境下开发的程式可以做到完全符合POSIX的规格。该标准最初由 IEEE 开发的标准族,部分已经被 ISO 接受为国际标准。该标准的具体内容 见 1.1.3。POSIX.1 和 POSIX.2 分别定义了 POSIX 兼容操作系统的 C 语言系统接口 以及 shell 和工具标准。这两个标准是通常提到的标准。

  BerkeleyUnix:

  Berkeley Unix泛称柏克莱大学所开发的UNIX 系列作业系统,包括 4.2BSD4.3BSD4.4BSD以及早期的SunOS。这些系统的C函式库中有许多杰出的设计,但却没有在上述两个标准中,包括select()函式、sockets等等,这些在glibc中都有支援。

  SVID:

  SVIDSystem VInterfaceDescription 的缩写,它是一份描述AT&T UNIX System V系统规格的文件,它是POSIX标准的延伸。Glibc?作了大部分的SVID规格要求,其中较重要的包括了行程之间的通?标准以及分享式记忆体(sharedmemory),至于其他的部分则较不常使用。?SVID主要的目的是希望可以做到与UNIX System V 的相容与程式的可移植性。

  XPG:

  XPGX/Open PortabilityGuide 的缩写,是由X/Open Company, Ltd.所发表,同时X/Open还拥有UNIX 商标的版权。而这份规格不但是POSIX 标准的扩充,同时也明定了一个UNIX 作业系统所应符合的要求。其中包括了iconv() 字集转换介面,以及部分 BSDSVID的特色。

0 0
原创粉丝点击