glibc库详解及与POSIX,system V这些库之间关系的说明
自己想了解下关于system v,在网上看到一篇详细的说明,与大家分享一下,原文地址http://hi.baidu.com/tekuba/item/570887775696542e5c178918
以前对glibc,POSIX等的关系一直很迷惑。这是今天在网上找到的说明glibc,POSIX,system V关系的一篇不错的文章,虽然有些地方不通顺(大概是直接用机器翻译过来的),但大概意思能明白了。通过下面的说明,我们就可以明白linux应用层的层次构造。关键是glibc,他是linux最底层的api,他包括了很多的规范,比如system V,ISO C,和POSIX 。其他的函数库,都是在调用glibc的基础上进行各种扩展,如X库等。当然我的理解也可能有误,欢迎探讨指正。
下面是部分摘录:
glibc
glibc 是gnu发布的libc库,也即c运行库。
glibc是linux系统中最底层的api(应用程序开发接口),
几乎其它任何的运行库都会依赖于glibc。
glibc除了封装linux操作系统所提供的系统服务外,
它本身也提供了许多其它一些必要功能服务的实现,主要的如下:
)string,字符串处理
)signal,信号处理
)dlfcn,管理共享库的动态加载
)direct,文件目录操作
)elf,共享库的动态加载器,也即interpreter
)iconv,不同字符集的编码转换
)inet,socket接口的实现
)intl,国际化,也即gettext的实现
)io
)linuxthreads
)locale,本地化
)login,虚拟终端设备的管理,及系统的安全访问
)malloc,动态内存的分配与管理
)nis
)stdlib,其它基本功能
GLIBC 的内容
由于glibc 囊括了几乎所有的UNIX 通行的标准(比如system V和POSIX标准,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 底下,统称为 man pages,其底下还分若干章节,其中第二章 (man2) 讲的是系统呼叫,而第三章 (man3) 讲的就是 libc 标准函式库,这些都是系统开发者重要的参考资料。
而在 GNU 的系统中,除了 man pages 之外,还有一套称为 info 的文件资料系统,而且里头的说明往往比 man pages 还要详尽,这在 glibc 中也不例外。Glibc 的info 文件位于/usr/share/info/libc.info* ,本文中有许多素材就是取自这些文件的内容。
字集转换模组与区域化资料库:
这些是与程式国际化与本土化相关的部分,主要可分成四大块: /usr/lib/gconv/ 内含大量的字集转换模组,大部分是各种字集及编码方式与系统的基底字集之间的转换。第二块是/usr/lib/locale,内含以系统基底字集写成的区域化资料库 (locale),像是 LC_CTYPE、LC_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-1996 年 libc5 问世以后,系统才开始支援 ELF 可分享函式库,同时该版的 C 函式库也作了其他 UNIX 上大部分的功能与函式群,可谓 GNU/Linux 发展上的一大进步。
然而 libc5 在程式国际化 (I18N) 与本土化 (L10N) 方面的支援很差,故那个时候若要开发所谓中文化的程式,就非得自行作一套标准不可。直到一两年后, GNU/Linux 换用了 GNU 所开发的 glibc-2.0 做为其 C 函式库后,其国际化与本土化的支援才开始起步,后?须v经 glibc-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 程式可以在这两个平台之间顺利移植。
比起过去的libc5,glibc 系列(一般又称之为libc6) 除了有完整的国际化与本土化支援外,同时还符合许多标准与规格,使得在glibc 下开发的程式可以很容易移植到其他UNIX 平台去。这些标准包括:
(以下都是glibc支持的规范)
ISO C:
ISO C 是International Standardfor the C programming language 的缩写,此标准明定了C 语言的语法,标准C 函式库应具备那些标头档、巨集定义、函式与物件等等,几乎在任何平台上的 C 语言(包括非UNIX 平台) 都支援此标准。
POSIX:
POSIX 是Portable OperatingSystem Interface for Computer Environments 的缩写,它是ISO C的延伸,明定了一个可移植的作业系统所应具备种种条件,其范围不只有系统函式库而已,还同时包括一些标准的工具程式、系统核心应有的特色与?作、以及在 C 函式库中某些与作业系统相关的低阶控制支援(如系统呼叫窗口) 等等。由于glibc 是完全按照POSIX 的标准制作的,同时搭配了符合 POSIX 标准的Linux 核心,故在此环境下开发的程式可以做到完全符合POSIX 的规格。
Berkeley Unix:
Berkeley Unix 泛称柏克莱大学所开发的 UNIX 系列作业系统,包括 4.2 BSD、4.3 BSD、4.4BSD 以及早期的 SunOS。这些系统的 C 函式库中有许多杰出的设计,但却没有在上述两个标准中,包括 select() 函式、sockets等等,这些在 glibc 中都有支援。
SVID:
SVID 是System V InterfaceDescription 的缩写,它是一份描述AT&T UNIX System V 系统规格的文件,它是POSIX 标准的延伸。Glibc ?作了大部分的SVID 规格要求,其中较重要的包括了行程之间的通?标准以及分享式记忆体(shared memory),至于其他的部分则较不常使用。?作SVID 主要的目的是希望可以做到与UNIX System V 的相容与程式的可移植性。
XPG:
XPG 是 X/Open Portability Guide 的缩写,是由 X/Open Company, Ltd. 所发表,同时X/Open 还拥有 UNIX 商标的版权。而这份规格不但是 POSIX 标准的扩充,同时也明定了一个 UNIX作业系统所应符合的要求。其中包括了 iconv() 字集转换介面,以及部分 BSD 与 SVID 的特色。
glibc库详解及与POSIX,system V这些库之间关系的说明的更多相关文章
- Python爬虫系列-Urllib库详解
Urllib库详解 Python内置的Http请求库: * urllib.request 请求模块 * urllib.error 异常处理模块 * urllib.parse url解析模块 * url ...
- Struts标签库详解【3】
struts2标签库详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri= ...
- VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...
- 最强常用开发库总结 - JSON库详解
最强常用开发库总结 - JSON库详解 JSON应用非常广泛,对于Java常用的JSON库要完全掌握.@pdai JSON简介 JSON是什么 JSON 指的是 JavaScript 对象表示法(Ja ...
- 常用开发库 - MapStruct工具库详解
常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...
- Lua的协程和协程库详解
我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...
- Python--urllib3库详解1
Python--urllib3库详解1 Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3.Urllib3提供了很多pyt ...
- STM32固件库详解
STM32固件库详解 emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/ 应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板 ...
- MySQL5.6的4个自带库详解
MySQL5.6的4个自带库详解 1.information_schema详细介绍: information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数 ...
随机推荐
- JSP之初识2
<与%之间不可有空格,但是后面可以有空格 <%@ page language="java" import="java.util.*" pageEnc ...
- C#之base关键字
1.base关键字用于从派生类中访问基类的成员. 2.调用基类上已被其他方法重写的方法. 3.指定创建派生类的实例是应调用基类的构造函数. 4.访问基类的公有成员和受保护成员,不能访问私有成员 5在静 ...
- 用JS实现回文数的精准辨别!!!
笔者最近在一边看<JS高级程序设计3>一边在FCC上找题目练习啊.那叫一个爽.这不,刚刚用生命在课堂,寝室,实验室,图书馆等各种场所将第五章"引用类型"搞定,FCC便知 ...
- javascript笔记——jQuery插件开发的几种方式
jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.e ...
- 编程语言中的Namespace
Namespace 1.C struct 2.C++(Pronounced 'see jia-jia' or 'see plus-plus') namespace 3.Python module(s) ...
- [GeekBand] C++11~14
一.关键字decltype 由对象得到对象的数据类型,例如 Complex a(1, 2); decltype(a) b(3, 4); declare type是让编译器去找到 ...
- C++ VARIANT 学习小记录
一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++.Java,此外还有JavaScript.VBScript等脚本语言,它们自立门派,各自维护自己的数据类型. C ...
- d3 之deal with data
之前说慢慢写有关D3的笔记,结果做完那个拓扑图就没写了,今天发现关于d3的用法有点遗忘.感觉有回顾一遍的必要. 之前的序对D3有一个简单的介绍,下面就做一些细节的东西.主要是贴代码,顺带注释和效果图. ...
- CCNA第一讲笔记
园区网:一组连续的局域网(校园网.企业内部网) 园区网拓扑: 一层楼的PC连接到一台交换机(同一层的PC可以互联):一栋楼的每层的交换机连接到同一台交换机(整栋楼的PC可以互联):每栋楼的交换机连接到 ...
- Qt 日志宏
随便写了一个日志帮助的宏,既可以如同qDebug()一般在调试时输出信息,也可以在输出文本文件 #ifndef LOG_H #define LOG_H #include <QDir> #i ...