一、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