【c&c++】glibc,libc,glib简介

发布时间 2024-01-09 14:29:57作者: opensmarty

一、glibc简介

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现

主要的如下:

(1)string,字符串处理

(2)signal,信号处理

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

(4)direct,文件目录操作

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

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

(7)inet,socket接口的实现

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

(9)io

(10)linuxthreads

(11)locale,本地化

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

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

(14)nis

(15)stdlib,其它基本功能

二、libc、glibc和glib的关系

libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN C 函数库

libc主要包括:

<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;

<errno.h>:定义用来报告错误条件的宏;

<float.h>:包含系统的浮点数大小限制;

<math.h>:包含数学库函数的函数原型;

<stddef.h>:包含执行某些计算 C 所用的常见的函数定义;

<stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;

<stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;

<string.h>:包含字符串处理函数的函数原型;

<time.h>:包含时间和日期操作的函数原型和类型;

<stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;

<signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;

<setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;

<locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。

地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;

<assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。

Linux下面的标准c库不仅有这一个,如uclibc、klibc,以及上面被提到的Linux libc,但是glibc无疑是用得最多的。glibc在/lib目录下的.so文件为libc.so.6

glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性

三、glib简介

glib是Gtk +库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为许多标准的、常用的C语言结构提供了相应的替代物。

如果在程序中要使用到glib库中的函数,则应该包含glib.h头文件(在gtk.h和gnome.h头文件中已经包含了glib.h了)

从下面的代码部分可以看到,都以g打头或者g_打头的都是glib的东西

3.1类型定义

1. 整数类型:gint8、guint8、gint16、guint16、gint32、guint32、gint64、guint64。不是所有的平台都提供64位整型

2. 整数类型gshort、glong、gint和short、long、int相同

3. 布尔类型gboolean:gboolean可以取两个值:TRUE和FALSE

4. 字符型gchar和char相同

5. 浮点型gfloat和gdouble和float、double完全等价

6. 指针gpointer对应于标准C的void*

7. gconstpointer对于于标准C的const void*

3.2内存管理

1. g_malloc总是返回gpointer类型。如果申请失败,g_malloc将退出程序,所以不用检查返回值

2. g_free忽略任何传递给它的NULL指针

3. g_realloc函数和realloc函数功能相同

4. g_malloc0:将分配的内存的每一个单元都置0

5.字符串处理

3.3数据结构


1 链表

glib提供了普通的单向链表和双向链表,分别是GSList和GList。链表中的数据域是一个gpointer类型(通过GINT_TO_POINTER转换也可以使得链表中可以保存整型)。

g_list_pervious用在双向链表中来查找指定元素的前一个元素,该函数为双向链表中独有的函数。

注:这里只讲单向链表函数,其它双向链表函数只需要将单向链表函数名改为“g_list_名称”即可,也适用。

g_slist_append用来在单向链表中添加一个元素

g_slist_remove用来在单向链表中删除一个元素

g_slist_next用来获取指定元素的下一个元素

g_slist_prepend用来在链表表头插入数据

g_slist_reverse用来将链表中的元素反置

g_slist_insert用来在指定位置插入一个元素

g_slist_remove用来在删除指定的元素

g_slist_foreach对链表的每一项调用GFunc函数。GFunc函数的定义如下:void* GFunc(gpointer data,gpointer user_data)


2 树

在glib中有两种不同的树:GTree是基本的平衡二叉树,它将存储的数据按其值排序成二叉排序树


3 哈希表


3.4 GString

GString类似于标准C的字符串类型,但是GString能够自动增长,这些特性可以防止程序中的缓冲区溢出。下面是GString的定义:

struct GString{

gchar* str; 指向字符串数据的存储空间

gint len; 字符串的长度

}

1. g_string_new(gchar* init):使用一个字符串来创建一个GString结构

2. g_string_free(GString* string,gint free_segment):释放GString所占的内存

3. g_string_assign(GString* lval,const gchar* rval):将字符串rval复制到lval,销毁lval原有的内容

4. g_string_truncate:截取字符串来生成指定长度的字符串

5. g_string_append:将字符串追加到指定字符串后面

6. g_string_append_c:将字符追加到指定的字符串后面

7. g_string_prepend:将字符串追加到指定的字符串前面

8. g_string_prepend_c:将字符追加到指定的字符串前面

9. g_string_sprintf:将一个格式化字符串写入到GString中

3.5 glib使用

gcc pkg-config --cflags --libs glib-2.0 hello.c -o hello