GLib库入门与实践
文章平均质量分 58
field1003
-
展开
-
GLib库入门与实践_目录
目录GLib库入门与实践_目录前言0_00_GLib库入门与实践_前言第一部分1_00_GLib库入门与实践_概述序1_01_GLib库入门与实践_GLib库简介1_02_GLib库入门与实践_GLib库源代码目录结构简介1_03_GLib库入门与实践_GLib库帮助文档简介1_04_GLib库入门与实践_GLib库的编译1_05_GLib库入门与实践_第一个基于GLib库的程序第二部分2_00_GLib库入门与实践_基础序2_01_GLib库入门与实践_GLib库版本与兼容性2原创 2022-03-11 11:45:27 · 2009 阅读 · 7 评论 -
0_00_GLib库入门与实践_前言
GLib库是用C语言实现的一个通用的、可移植的实用程序库,由GNOME的GTK小组开发并维护,最早用在GTK+程序开发上,后来被越来越多的程序使用。刚开始,GLib库叫GLib-1.0,形成于约1995到1997年间,彼时提供的功能还比较少,后来于2002年升级到GLib-2.0,提供的功能也越来越丰富。原创 2022-03-11 11:54:49 · 2026 阅读 · 1 评论 -
1_00_GLib库入门与实践_概述序
本部分包括GLib库简介、源码代码目录结构简介、官方帮助文档简介、如何编译GLib库,如何编写基于GLib库的程序。原创 2022-03-11 11:56:55 · 435 阅读 · 0 评论 -
1_01_GLib库入门与实践_GLib库简介
GLib库是用C语言实现的一个通用的、可移植的实用程序库,由GNOME的GTK小组开发并维护,最早用在GTK+程序开发上,后来被越来越多的程序所引用。刚开始,GLib库叫GLib-1.0,形成于约1995到1997年间,彼时提供的功能还比较少,后来于2002年升级到GLib-2.0,提供的功能也越来越丰富。截止目前,GLib的最新版本已经是GLib-2.56.4(当前最新:GLib-2.71.0,目前仍在更新)。原创 2022-03-11 11:58:36 · 3195 阅读 · 0 评论 -
1_02_GLib库入门与实践_GLib库源代码目录结构简介
GLib-2.0库遵循LGPL协议,其源码可以从官方获取。### 源码获取途径最新的GLib-2.0库可以从GNOME官方的GitLab上获取:[https://gitlab.gnome.org/GNOME/glib](https://gitlab.gnome.org/GNOME/glib)历史源码可从下面网站获取:[https://download-fallback.gnome.org/sources/glib/](https://download-fallback.gnome.org/so原创 2022-03-11 12:00:10 · 1201 阅读 · 0 评论 -
1_03_GLib库入门与实践_GLib库帮助文档简介
GLib官方帮助文档可以从GNOME官网在线预览,也可以从源码目录获取。源码目录下的glib-2.56.4/docs/reference/glib/html为全部的帮助文档, 此文档使用gtk-doc生成。里面有一个inde.html,是为索引页,通过索引页可以很方便地跳转到其他页面。原创 2022-03-11 12:02:23 · 936 阅读 · 0 评论 -
1_04_GLib库入门与实践_GLib库的编译
GLib-2.0支持动态编译,也支持静态编译,支持交叉编译,也支持automake、meson自动构建系统编译。默认情况下,编译GLib-2.0会生成三个库,GLib,GObject和GIO,如果只需要Glib-2.0的GLib库,还可以修改编译脚本,只编译GLib部分,GLib只依赖glibc、libpthread及libpcre几个库,比GObject及GIO的依赖要少很多,好多依赖都不需要再安装。原创 2022-03-11 15:09:00 · 4980 阅读 · 2 评论 -
1_05_GLib库入门与实践_第一个基于GLib库的程序
基于GLib-2.0开发的程序,与基于其他C语言库开发的程序并无区别,只需要在编译时指定GLib-2.0的头文件及库路径即可。下面介绍动态方式和静态方式如何开发基于GLib的程序。原创 2022-03-11 15:09:32 · 1019 阅读 · 0 评论 -
2_00_GLib库入门与实践_基础序
本部分是GLib的基础部分,包括八章内容。2_01章介绍了GLib库的版本概念,不同版本的库可能会有兼容性问题。2_02章介绍了GLib定义的基本数据类型,包括不属于标准C的新类型、保证在所有平台上大小相同的整数类型、比标准C语言更容易使用的类型、与标准C类型完全对应的类型及与标准C99类型完全对应的类型。2_03章介绍了一些基础的标准宏。2_04章介绍了整型与指针类型互相转换的一组宏。2_05章介绍了字节序转换概念及字节序转换宏。2_06章介绍了带溢出检查的整型加法和乘法运算函数,当溢出时会原创 2022-03-11 19:01:08 · 371 阅读 · 0 评论 -
2_01_GLib库入门与实践_GLib库版本与兼容性
GLib库不断更新,有些函数新增进来,有些函数已过时被废弃,所以,如果不是使用静态编译或不是自带动态库,则基于GLib的应用程序在运行时可能会出现找不到符号的错误。原创 2022-03-11 19:01:41 · 855 阅读 · 0 评论 -
2_02_GLib库入门与实践_基本数据类型
出于编码风格一致性或可移植性考虑,一般的库,都会重新定义自己的基本数据类型。GLib库定义的基本数据类型GLib也定义了许多常用类型,可分为以下几组:不属于标准C的新类型(但在各种C标准库头文件中定义)-gboolean、gssize。保证在所有平台上大小相同的整数类型-gint8、gint8、gint16、gint16、gint32、gint32、gint64、gint64。比标准C语言更容易使用的类型-gpointer、gconstpointer、guchar、guint、gushort、g原创 2022-03-13 01:05:26 · 460 阅读 · 0 评论 -
2_03_GLib库入门与实践_标准宏
标准宏定义了一些常用的宏,分为两类,函数及数据类型。原创 2022-03-11 21:58:10 · 532 阅读 · 0 评论 -
2_04_GLib库入门与实践_类型转换宏
类型转换宏提供了整型与指针类型的互相转换功能,非常方便,也经常会用到。类型转换宏说明#define GINT_TO_POINTER() // 整型转换为指针#define GPOINTER_TO_INT() // 指针转换为整型#define GUINT_TO_POINTER() // 无符号整型转换为指针#define GPOINTER_TO_UINT() // 指针转换为无符号整型#define GSIZE_TO_POINTER() // gsize类型转换为指针#defin原创 2022-03-11 22:02:19 · 559 阅读 · 0 评论 -
2_05_GLib库入门与实践_字节序转换宏
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。常见的字节序有Little Endian和Big Endian两种。Little Endian:将低序字节存储在起始地址Big Endian:将高序字节存储在起始地址为了便于在两种系统中传输数据,有了字节序转换的概念,传输前将多个字节转换成与对方一致的存储顺序。字节序转换的基本转换函数有以下四个。#define g_htonl() // 32位主机字节序转换成网络字节序#define g_htons() // 16原创 2022-03-11 22:02:59 · 359 阅读 · 0 评论 -
2_06_GLib库入门与实践_带溢出检查的整型运算
整数运算时可能会出现溢出情况,因此GLib提供了整数相加及相乘时溢出检查函数。当未溢出时,函数返回TRUE,否则返回FALSE。#define g_uint_checked_add() // 无符号int相加,无溢出则返回TRUE#define g_uint_checked_mul() // 无符号int相乘,无溢出则返回TRUE#define g_uint64_checked_add() // 64位无符号int相加,无溢出则返回TRUE#define g_uint64_c原创 2022-03-11 22:07:48 · 451 阅读 · 0 评论 -
2_07_GLib库入门与实践_数学常数定义
GLib定义了一些常用的数学常量,当然这些常量的值都是近似值。#define G_E // 常数e的近似值#define G_LN2 // ln2的近似值#define G_LN10 // ln10的近似值#define G_PI // 圆周率PI的近似值#define G_PI_2 // 圆周率PI/2的近似值#define G_PI_4 // 圆周率PI/4的近似值#define G_SQRT2 // 根号2的近似值...原创 2022-03-11 22:08:38 · 290 阅读 · 0 评论 -
2_08_GLib库入门与实践_原子操作
原子操作一般指不被中断的一个或一系列操作。GLib原子操作特点GLib提供了对整数和指针两种数据类型的原子操作。其操作特点如下:名称中包含int的宏可以在指向gint和guint的指针上运行名称中包含pointer的宏可以在指向任何指针大小的值的指针上操作get、set和exchange可以用在gint及gpointer上add可以用在gint和gsszie上and、or、xor运算只能用在无符号整数(用gint和gssize存储)上。原子操作函数列表其函数列表如下:gint g_原创 2022-03-11 22:09:02 · 554 阅读 · 0 评论 -
3_00_GLib库入门与实践_通用工具集序
本部分是GLib的通用工具集部分,包括十八章内容。3_01章介绍了GLib库的测试框架,本测试框架功能非常强大,可以实现函数级别的自动化测试,而且还可以生成html格式的报告。3_02章介绍了GLib的字符串处理函数,这些处理函数跨平台,比标准C库更容易使用,而且还没有内存越界的风险。3_03章介绍了文件操作、目录操作、临时文件操作及内存映射相关功能。3_04章介绍了一个计时器功能,可以计算流逝的时间,这在性能优化中会比较好用。3_05章介绍了Glob风格的模式匹配,Linux的命令行就是Glo原创 2022-03-11 22:09:35 · 474 阅读 · 0 评论 -
3_01_GLib库入门与实践_测试框架
简介GLib提供了一套测试框架,可以帮助我们实现自动测试,而且还能生成报告,下面简单介绍一下这个框架的基本使用方法。数据结构enum GTestFileTypeenum GTestTrapFlagsenum GTestSubprocessFlagstypedef GTestCase // 测试例typedef GTestSuite // 测试套件,一个TestSuite可包含多个TestCase函数列表void g_test_minimized_result ()voi原创 2022-03-11 22:10:08 · 1583 阅读 · 0 评论 -
3_02_GLib库入门与实践_字符串处理函数
简介GLib提供了一组处理字符串的函数,比标准C库更容易使用,还没有内存越界的风险,非常方便。数据结构无函数列表gchar * g_strdup ()gchar * g_strndup ()gchar ** g_strdupv ()gchar * g_strnfill ()gchar * g_stpcpy ()gchar * g_strstr_len ()gchar * g_strrstr ()gchar * g_strrstr_len ()gboolean g_原创 2022-03-11 22:10:39 · 2008 阅读 · 1 评论 -
3_03_GLib库入门与实践_文件操作
简介GLib提供了一系列可移植的文件操作函数,大概有以下几类。基础操作函数:一般都有对应的C标准函数,但这些函数实现了不同操作系统的封装,因此使用这些函数写的程序可以移植到其他操作系统上编译运行。文件操作函数:包括读取设置文件内容,检测文件是否存在,读取符号链接文件的真实内容。目录操作函数:包括目录打开、读取、关闭、创建多级目录、重新进入目录等操作。临时文件及临时目录操作相关函数可对临时文件及临时目录进行操作。内存映射操作函数:是指基于mmap的文件到内存映射的一组函数。数据结构enum原创 2022-03-11 22:11:09 · 1347 阅读 · 0 评论 -
3_04_GLib库入门与实践_计时器
简介GLib提供的timer不是定时器,而是一个计时器,记录程序运行时间的流逝,在程序调优或性能优化时非常有用,可以很方便地计算某段代码的实际执行时间。本计时器还支持暂停恢复及重启操作。数据结构GTimer是一个不透明类型数据结构,可以整体使用它,但无法单独引用其内部的一个结构体成员。typedef struct _GTimer GTimer;函数列表GTimer * g_timer_new ()void g_timer_start ()void g_timer_stop ()vo原创 2022-03-12 00:01:12 · 1498 阅读 · 0 评论 -
3_05_GLib库入门与实践_Glob_Pattern模式匹配
简介Glob风格模式匹配,即使用特定的字符(被称为元字符),实现快速匹配字符串的目的。与正则表达式相比,glob风格通配符更加简单,速度也更快,但功能相对来说没有正则表达式那么强大。Glob风格模式匹配应用场景举例:在shell命令行,我们经常会输入ls ./dir/*,这就是一个glob风格的通配符。在git中,.gitignore文件,是glob风格模式匹配。在redis数据库订阅、发布功能中也用到了glob风格模式匹配。不同语言提供的Glob库支持规则也不相同,这里列举常见的Glob风原创 2022-03-12 00:02:05 · 450 阅读 · 0 评论 -
3_06_GLib库入门与实践_正则表达式
简介GLib正则表达式Regex依赖PCRE库,在编译时,如果configure参数指定的是internal,则使用GLib内部自带的PCRE库,如果没有指定internal参数,则会使用系统的PCRE库。数据结构enum GRegexCompileFlags // 编译标识,enum GRegexMatchFlags // 匹配标识struct GRegex //正则表达式的编译形式,这是一个不透明结构体struct GMatchInfo //不透明结构体,内含匹配信息函数列原创 2022-03-12 00:02:53 · 700 阅读 · 0 评论 -
3_07_GLib库入门与实践_Base64编解码
简介Base64是一种非常常见的数据编码方式。由于其编码时基于64个可打印字符,因此叫做Base64。数据结构无函数列表gsize g_base64_encode_step ()gsize g_base64_encode_close ()gchar * g_base64_encode ()gsize g_base64_decode_step ()guchar * g_base64_decode ()guchar * g_base64_decode_inplace ()函数功能分类B原创 2022-03-12 00:03:21 · 413 阅读 · 0 评论 -
3_08_GLib库入门与实践_数据校验和(MD5、SHA)
简介GLib提供了计算校验和(也叫摘要)的方法,支持MD5、SHA-1、SHA-256等散列算法。数据结构数据校验和的数据结构是不透明结构体,只能作为整体使用,无法单独引用其内部成员。typedef struct _GChecksum GChecksum;函数列表gssize g_checksum_type_get_length ()GChecksum * g_checksum_new ()GChecksum * g_checksum_copy ()void g_checksum_fre原创 2022-03-12 00:04:04 · 442 阅读 · 0 评论 -
3_09_GLib库入门与实践_HMAC校验
简介MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。HMAC算法基于信息摘要算法,信息摘要算法有MD和SHA两大类。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种,SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。在GLib中,由于GChecksumT原创 2022-03-12 00:04:47 · 301 阅读 · 0 评论 -
3_10_GLib库入门与实践_伪随机数生成器
简介伪随机数生成算法基于梅森旋转算法,可生成boolean、int、double类型的随机数。数据结构伪随机数GRand的数据结构是不透明结构体,只能作为整体使用,无法单独引用其内部成员。typedef struct _GRand GRand;函数列表GRand * g_rand_new_with_seed ()GRand * g_rand_new_with_seed_array ()GRand * g_rand_new ()GRand * g_rand_copy ()void g_r原创 2022-03-12 00:05:30 · 366 阅读 · 0 评论 -
3_11_GLib库入门与实践_字符集、字符编码及国际化
简介GLib提供了字符集转换、字符编码操作和国际化操作函数。数据结构字符集转换GIConv的数据结构是不透明结构体,只能作为整体使用,无法单独引用其内部成员。typedef struct _GIConv *GIConv;字符编码操作和国际化都是对字符或字符串的操作,没有专门的数据结构类型。函数列表字符集转换gchar * g_convert ()gchar * g_convert_with_fallback ()gchar * g_convert_with_iconv ()GICon原创 2022-03-12 00:06:00 · 619 阅读 · 0 评论 -
3_12_GLib库入门与实践_时间、日期、时区
简介时间、日期和时区操作函数。数据结构时间、日期、时区的数据结构如下。struct GDate { guint julian_days : 32; // 儒略日 guint julian : 1; /* 是否为儒略日格式 */ guint dmy : 1; /* 是否为dmy格式 */ /* DMY 成员变量 年月日 */ guint day : 6; guint month : 4; guint year : 16;};typed原创 2022-03-12 00:06:19 · 895 阅读 · 0 评论 -
3_13_GLib库入门与实践_命令行解析
简介我们常见的如ls,grep, find等命令,通过–help查看,可以看到它们支持非常多的参数,这说明程序支持的功能非常强大,而且这些参数使得程序弹性更大,也更加灵活。如果我们也想写出这样功能强大的程序,GOption将是一个很好用的功能组件。GOption提供了对程序参数的解析功能,使用GOption可以很方便地创建支持多参数的应用程序。数据结构struct GOptionEntry { const gchar *long_name; // 长参数名 gchar sho原创 2022-03-12 00:06:47 · 1187 阅读 · 0 评论 -
3_14_GLib库入门与实践_xml解析
简介一个简单的xml如下:<xml><node attr1="value1" attr2="value2">aaa</node></xml>其中:<xml>和<node>分别是开始标签(或者叫开始节点)<xml>没有属性,<node>有两个属性node的attr1属性值为value1node的attr2属性值为value2xml标签没有值,但它包含子标签node标签的值为aaa<原创 2022-03-12 00:07:18 · 462 阅读 · 0 评论 -
3_15_GLib库入门与实践_Key-Value风格文件解析
简介GKeyFile是一个key-value文件解析器,可以解析key-value文件,也可以对文件进行修改。key-value文件和ini文件非常相似,但又有不同(不同点见本章专题),freedesktop.org的很多标准都采用了key-value文件,如Desktop Entry Specification 标准及Icon Theme Specification。数据结构GKeyFile是一个不透明的结构体。typedef struct _GKeyFile GKeyFile;函数列表GK原创 2022-03-12 00:07:45 · 558 阅读 · 0 评论 -
3_16_GLib库入门与实践_书签解析
简介GBookmarkFile可以解析、编辑或创建包含URI书签的文件,以及有关URI指向的资源的一些元数据,例如,MIME类型、正在注册书签的应用程序以及应用于表示书签的图标。书签文件(文件名一般是xbel后缀)的语法在Desktop Bookmark Specification中有详细描述,是一种叫做XML Bookmark Exchange Language的语言,由于平时用的较少,这里不再赘述。数据结构GBookmarkFile是一个不透明的数据结构,可以整体引用它,但无法访问其内部变量。t原创 2022-03-12 00:08:05 · 310 阅读 · 0 评论 -
3_17_GLib库入门与实践_hook函数
简介GLib提供了一组函数和数据的对应关系的功能,即hook函数。所有hook函数以链表形式组织在一起,该链表上每个节点都由数据和其处理函数组成,hook链表特有的遍历函数invoke及marshal可以在遍历时使用默认数据处理函数或指定新的处理函数处理数据。hook函数链表还提供了hook节点插入、节点查找、节点删除等功能。举例说明如下。有一组数据 11 22 33 44,其默认处理函数分别为乘1,乘2,乘3,乘4,invoke遍历完,变成11,44,99,176,使用marshal函数,marsha原创 2022-03-12 00:08:34 · 550 阅读 · 0 评论 -
3_18_GLib库入门与实践_进程创建
简介进程可以创建子进程,也可以执行外部程序。在不同平台上,子进程创建及执行外部程序的方法也不相同,GLib提供了一种跨平台的子进程创建接口。在linux上,执行外部程序最常见的是fork+exec方式。GLib提供了同步和异步两种方式创建子进程并执行外部程序。数据结构无函数列表gboolean g_spawn_async_with_pipes ()gboolean g_spawn_async ()gboolean g_spawn_sync ()gboolean g_spawn_check_e原创 2022-03-12 00:09:35 · 827 阅读 · 0 评论 -
4_00_GLib库入门与实践_数据类型序
本部分是GLib的数据类型部分,包括十六章内容。4_01章介绍了字符串对象,与上一张的字符串操作函数不同,本章讲解的是将字符串视作一个对象,所有操作都是对一个字符串对象的操作。4_02章介绍了字符串块对象的操作。4_03章介绍了普通数组的基本操作。4_04章介绍了指针数组,指针数组比普通数组,更灵活,可存储可变长度的数据。4_05章介绍了字节数组,字节数组可以存储任意类型的数据,包括二进制内容。4_06章介绍了单链表操作。4_07章介绍了双链表操作。4_08章介绍了双端队列。4_09章介原创 2022-03-12 00:10:03 · 270 阅读 · 0 评论 -
4_01_GLib库入门与实践_字符串
简介字符串是一种非常常见的数据类型,为了便于操作字符串,GLib首先将字符串封装成类似C++ CString对象的一个结构体,又对字符串的一系列操作进行了封装,使用起来非常便捷,又避免了很多内存泄露的风险。对非封装的简单字符串的处理见通用工具集章的字符串处理函数一节。数据结构struct GString { gchar *str; //数据,以null结尾,可以作为普通字符串使用 gsize len; //字符串长度,不包括null字节 gsize allocated_len;原创 2022-03-12 00:10:33 · 668 阅读 · 0 评论 -
4_02_GLib库入门与实践_字符串块
简介字符串块可用来存储多个字符串。字符串块有一个特点,当以const方式插入字符串时,若之前已经存在该字符串,则后插入的字符串不会开辟新的内存空间,只会指向之前的字符串,其实现原理为GStringChunk内部维护了一个hash表,当后插入的字符串为const方式插入,会从hash表中查找该字符串是否存在,若已存在,则不会重复插入。数据结构typedef struct _GStringChunk GStringChunk;字符串块是一个不透明的数据结构,我们可以整体使用它,但无法单独访问其结构体成原创 2022-03-12 00:10:59 · 263 阅读 · 0 评论 -
4_03_GLib库入门与实践_普通数组
简介数组是一种常见的数据结构,其特点是内存连续。GLib提供了三种类型的数组,普通数组,指针数组和字节数组,本节讨论普通数组。普通数组非常简单,GLib提供了对普通数组的常用操作,如创建、测长、释放、插入、访问、移除及排序等等。数据结构struct GArray { gchar *data; guint len;};函数列表GArray * g_array_new ()GArray * g_array_sized_new ()GArray * g_array_ref ()vo原创 2022-03-12 00:12:38 · 668 阅读 · 0 评论