自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 资源 (1)
  • 收藏
  • 关注

原创 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 2309 7

原创 logrotate日志转储

etc/logrotate.conf内有一行include /etc/logrotate.d,加载该目录下的所有规则文件。系统常见的日志文件如/var/log/message、/var/log/boot.log、/var/log/syslog均已配置了日志转储。但这里有个问题,/etc/logrotate.d/testlog是被/etc/logrotate.conf包含进去的,logrotate.conf的参数配置和testlog的参数配置有可能不同,这将会影响结果。

2022-09-17 00:32:33 1454 1

原创 附录B_GLib库入门与实践_附带源码的CMake文件内容

附带源码CMake工程目录结构附录A已经介绍过,本系列文章是由CMake构建工具组织的,以glib_markup和glib_regex为例,目录结构举例如下:glib_examples├── CMakeCommonFile.txt├── CMakeCustomCommonFile.txt├── CMakeLists.txt├── compile_and_exec_all_examples.sh├── glib_markup│ ├── CMakeLists.txt│ ├── glib

2022-03-14 09:57:36 549

原创 附录A_GLib库入门与实践_本系列文章附带源码简介

本系列文章包含了200多个示例程序,为了组织这些源码,使用CMake构建工具建立CMake工程以对其进行管理。现以glib_markup和glib_regex两个功能模块为例,讲解如何使用附带源码,以及如何基于本CMake工程添加新的模块。有些示例为错误示例,在文章中会特别说明,错误示例的源码目录也一般以_err结尾。所有正确的示例代码均在CentOS7.6 X86_64平台上编译通过,且通过valgrind检查工具检查无内存泄露。附带源码目录结构简介glib_examples├── CMakeCo

2022-03-14 09:56:48 699

原创 5_10_GLib库入门与实践_内存切片分配器

简介内存切片分配器使用了复杂的分层设计,灵感来自Bonwick的slab内存分配器,它提供了一种节省空间和多处理可扩展的方式来分配相等大小的内存,避免了过多的内存浪费,还兼顾了可伸缩性和性能问题。内存切片分配器使用posix_memaligin()来优化许多相同大小的块内存分配,并根据线程可利用空间表(free list)来快速分配指定结构大小的内存。在内存释放之后,额外的缓存逻辑还该内存保留一段时间。一般来说,频繁申请释放的小块内存,建议使用内存切片分配器。数据结构无特殊数据结构函数列表gp

2022-03-14 09:56:02 601

原创 5_09_GLib库入门与实践_内存申请及释放

简介GLib内存申请及释放函数。数据结构无特殊数据结构函数列表#define g_new()#define g_new0()#define g_renew()#define g_try_new()#define g_try_new0()#define g_try_renew()gpointer g_malloc ()gpointer g_malloc0 ()gpointer g_realloc ()gpointer g_try_malloc ()gpoint

2022-03-14 09:55:37 1549

原创 5_08_GLib库入门与实践_IO通道

简介GIOChannel数据类型旨在提供一种可移植的方法来使用文件描述符、管道和套接字,并将它们集成到主事件循环中。目前,UNIX平台已完全支持,Windows平台只是部分支持。要在UNIX系统上创建新的GIOChannel,可以使用使用 g_io_channel_unix_new(),这适用于普通文件描述符、管道和套接字。使用g_io_channel_new_file()可以以独立于系统的方式为文件创建通道。一旦创建了 GIOChannel,就可以通过函数g_io_channel_read_char

2022-03-14 09:55:15 1085

原创 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 528

原创 5_07_GLib库入门与实践_主循环

简介GLib主循环用来处理GLib和GTK+应用程序的所有事件源。GTK+的事件驱动特性正是基于GLib主循环。GLib主循环设计思想是基于poll的"prepare/check/dispatch"模式,支持多事件源,像键盘、鼠标、文件、管道、设备、套接字、定时器及其他自定义事件类型对象都可以产生事件,这些事件可以作为事件源增加到主循环被统一管理。当产生事件时,主循环会调用事件源处理函数处理该事件。GLib主循环模块内置了Idle和Timeout两个事件源。Idle主要实现异步事件,支持重复执行,当用

2022-03-13 00:22:07 1108

原创 5_06_GLib库入门与实践_模块动态加载

简介模块动态加载支持跨平台使用,支持Windows、Linux和MacOS,每个平台都有单独的实现,最后统一封装成对外调用的接口。Windows的实现代码在gmodule-win32.cLinux的实现代码在gmodule-dl.cMacOS的实现代码在gmodule-dyld.c数据结构模块动态加载的数据结构是一个不透明数据结构,只能整体使用它,无法单独引用其内部成员。typedef struct _GModule GModule;函数列表gboolean g_module_su

2022-03-13 00:21:31 407

原创 5_05_GLib库入门与实践_异步队列

简介在数据类型里面介绍过双端队列,双端队列没有线程和锁的概念,需要调用者自行保证数据同步性,本章要介绍的是异步队列,本身具有多线程同步特性,非常方便使用。数据结构异步队列的数据结构不透明,只可以整体使用它,无法单独引用其内部的成员。typedef struct _GAsyncQueue GAsyncQueue;函数列表GAsyncQueue * g_async_queue_new ()GAsyncQueue * g_async_queue_new_full ()GAsyncQueue

2022-03-13 00:20:45 1377

原创 5_04_GLib库入门与实践_线程池

简介线程池是在多线程编程时经常用到的技术。在进行多线程任务处理时,如果线程频繁创建和销毁,将会使系统开销变大,在这种情况下,上一个任务执行完后不销毁之前创建的线程,后续任务重用该线程,将会大大减小开销。为了管理这些创建之后不再销毁的线程,便有了线程池的概念。GLib的线程池除了提供一般的线程池函数外,还提供了诸如获取当前运行的线程数量、获取未处理的任务数量、获取或设置线程池的最大线程数量、获取未使用的线程数量、设置未使用的最大线程数量、停止所有目前未使用的线程,但经过实际测试,这里面有些功能并未生效。

2022-03-13 00:19:49 632

原创 5_03_GLib库入门与实践_线程

简介GLib提供了对线程、互斥锁、递归锁、读写锁、条件量、线程私有数据、线程一次性初始化、位锁及指针位锁的操作。数据结构struct GThread // 线程union GMutex // 互斥锁struct GRecMutex // 递归锁struct GRWLock // 读写锁struct GCond // 条件变量struct GPrivate // 线程私有数据struct GOnce // 线程一次性初始化函数列表gpoin

2022-03-13 00:18:38 1206 2

原创 5_02_GLib库入门与实践_日志和调试

简介GLib提供了一套日志输出接口,包括不同日志级别的输出以及与systemd日志系统的对接。数据结构日志输出最主要的数据结构是日志级别。GLib提供了debug、info、message、warning、critical和error这六种日志输出级别。其中,error默认是FATAL级别日志输出,输出该级别日志会调用abort()导致程序退出。enum GLogLevelFlags函数列表void g_log ()void g_logv ()#define g_message(

2022-03-13 00:17:40 1515 3

原创 5_01_GLib库入门与实践_错误、告警和断言

简介Linux系统编程中,有一个errno的变量,还有与之对应的perror及strerrno函数,在GLib中,也有相关的一组功能函数GError(源码在gerror.[ch]两个文件),与errno类似。注意,GLib的GError是独立的系统,其错误码与Linux的errno错误码并不相同。GLib还专门提供了一组告警和断言的操作函数,源码在gmessages.[ch]两个文件。数据结构GError的数据结构体见下。其中,code是错误码,message是错误码对应的字符串。struct

2022-03-13 00:17:17 677

原创 5_00_GLib库入门与实践_核心应用支持序

本部分是GLib的核心应用支持部分,包括十章内容。5_01章介绍了错误系统GError、告警和断言。5_02章介绍了GLib的一套日志输出接口。5_03章介绍了线程、互斥锁、递归锁、读写锁、条件量、线程私有数据、线程一次性初始化及位锁相关的操作函数。5_04章介绍了一个线程池。5_05章介绍了带线程和锁的异步队列。5_06章介绍了模块动态加载技术。5_07章介绍了GLib的主循环。5_08章介绍了一套通用的IO通道。5_09章介绍了内存的申请及释放。5_10章介绍了基于slab思想的内

2022-03-13 00:16:42 297

原创 4_15_GLib库入门与实践_N叉树

简介平衡二叉树是一种特殊的树,前面已经介绍过。本章介绍的是N叉树。(本节以下内容翻译自官方文档)GNode 结构及其相关函数提供了一个 N 叉树数据结构,其中树中的节点可以包含任意数据。要创建一棵新树,请使用 g_node_new()。要将节点插入树中,请使用 g_node_insert()、g_node_insert_before()、g_node_append() 和 g_node_prepend()。要创建一个新节点并将其插入树中,请使用 g_node_insert_data()、g_no

2022-03-13 00:16:19 446

原创 4_14_GLib库入门与实践_数据集

简介(本段内容翻译自官方文档)数据集将数据元素组与特定的内存位置相关联。如果您需要将数据与从外部库返回的结构相关联,这些非常有用。由于您无法修改结构,因此您可以将其在内存中的位置用作数据集的键,您可以在其中将任意数量的数据元素与其关联。大多数数据集函数有两种形式。第一种形式使用字符串来标识与位置关联的数据元素。第二种形式使用 GQuark 标识符,这些标识符是通过调用g_quark_from_string()或g_quark_from_static_string()创建的。第二种形式更快,因为它不需要

2022-03-13 00:15:22 283

原创 4_13_GLib库入门与实践_数据列表

简介(本段内容翻译自官方文档)数据列表提供任意数据元素的列表,可以使用字符串或与字符串的GQuark访问这些数据元素。GQuark方法更快,因为无论如何都必须将字符串转换为 GQuarks。数据列表用于将任意数据与 GObject 相关联,使用 g_object_set_data()和相关函数。要创建数据列表,请使用 g_datalist_init()。要将数据元素添加到数据列表,请使用 g_datalist_id_set_data()、g_datalist_id_set_data_full(

2022-03-13 00:14:56 353

原创 4_12_GLib库入门与实践_夸克

简介Quarks标识一对字符串和整数的关联关系。给定字符串或者给定整数,可以方便地获取另一个值。数据结构数据结构typedef guint32 GQuark;函数列表#define G_DEFINE_QUARK()GQuark g_quark_from_string ()GQuark g_quark_from_static_string ()const gchar * g_quark_to_string ()GQuark g_quark_try_string ()const

2022-03-13 00:14:27 408

原创 4_11_GLib库入门与实践_序列

简介GLib序列,是这样一种数据结构,它具有和链表一样的API函数,但内部却是用二叉树实现,因此这个数据结构既有链表操作的便利,又有二叉树查找的高效。数据结构序列有两个常用的数据结构,序列本身和迭代器,这两者都是内部不透明的结构体,可以作为一个整体使用它,但无法访问其内部成员变量。typedef struct _GSequence GSequence;typedef struct _GSequenceNode GSequenceIter;函数列表GSequence * g_sequen

2022-03-13 00:13:56 782

原创 4_10_GLib库入门与实践_平衡二叉树

简介平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法)。它具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的插入,查找,删除时间复杂度均为O(logN)。数据结构平衡二叉树的数据结构GTree是不透明结构体,只能作为整体使用,无法直接引用其内部变量。typedef struct _GTree GTree;函数列表GTree * g_tree_new ()GTree * g_tree

2022-03-13 00:13:20 811 2

原创 4_09_GLib库入门与实践_哈希表

简介Hash是一种常见的数据结构,GLib提供了操作Hash表的多种操作函数。数据结构Hash表有两个重要的数据结构,GHashTable和GHashTableIter,这两者都是不透明的数据结构,可以整体使用它,但无法单独使用其中的一个结构体成员。GHashTable是Hash表本身相关,GHashTableIter与迭代器相关,用来遍历或操作Hash表中的数据。Hash表:typedef struct _GHashTable GHashTable;迭代器:typedef struct _

2022-03-13 00:12:45 1106

原创 4_08_GLib库入门与实践_双端队列

简介在Glib中,GQueue双端队列是由GList实现的一个队列结构,由于两端都可以push和pop,当从队列尾push从头pop时可看作队列,当从头push头pop时可看做栈。数据结构GQueue的数据结构struct GQueue { GList *head; GList *tail; guint length;};函数列表GQueue * g_queue_new ()void g_queue_free ()void g_queue_free_full ()void

2022-03-13 00:12:13 734

原创 4_07_GLib库入门与实践_双链表

简介在Glib中,链表有单向链表和双向链表两种,单向链表只有一个next指针,双向链表有prev和next两个指针。除非对程序的内存使用有非常严格的限制,一般情况下,尽量使用双向链表,这在查找、插入等操作时比单向链表方便很多。单向链表的数据结构为GSList,双向链表的数据结构为GList,两者操作方式基本相同,只不过单向链表比双向链表少很多操作函数。数据结构单向链表数据结构struct GSList { gpointer data; GSList *next;};双向链表数据结构

2022-03-13 00:11:28 1002

原创 4_06_GLib库入门与实践_单链表

简介单向链表是一种常见的数据结构,它只有一个后向指针,结构简单。数据结构GSList 包含一个next指针和一个gpointer(实际上是void *)类型的数据data。struct _GSList{ gpointer data; GSList *next;};函数列表GSList * g_slist_alloc ()GSList * g_slist_append ()GSList * g_slist_prepend ()GSList * g_slist_inser

2022-03-13 00:10:47 582

原创 4_05_GLib库入门与实践_字节数组

简介GLib提供了三种类型的数组,普通数组,指针数组和字节数组,本节讨论字节数组。字节数组比普通数组和指针数组最大的不同是它可以存储任意值,甚至包括’\0’这种只能出现在普通字符串末尾的特殊字符。数据结构本节操作的数据结构有两个,一个是GByteArray,一个是GBytes。GByteArray结构体定义如下:struct GByteArray { guint8 *data; guint len;};GBytes结构体对用户不透明。函数列表GByteArray * g_

2022-03-13 00:09:39 809

原创 4_04_GLib库入门与实践_指针数组

简介GLib提供了三种类型的数组,普通数组,指针数组和字节数组,本节讨论指针数组。在上一节介绍GArray动态数组时,数组元素可以是int类型,也可以是一个结构体类型,甚至结构体中的成员变量还可以是一个指针,但根据其内存模型一节,每个数组元素的长度都是固定的,如果我们想存长度不固定的字符串怎么办?一种方法是利用带指针的结构体,将字符串存在结构体的指针成员变量中,另一种方法就是指针数组了。数据结构普通数组和指针数组的结构体定义如下:普通数组struct GArray { gchar *data

2022-03-12 00:13:25 876

原创 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 776

原创 4_02_GLib库入门与实践_字符串块

简介字符串块可用来存储多个字符串。字符串块有一个特点,当以const方式插入字符串时,若之前已经存在该字符串,则后插入的字符串不会开辟新的内存空间,只会指向之前的字符串,其实现原理为GStringChunk内部维护了一个hash表,当后插入的字符串为const方式插入,会从hash表中查找该字符串是否存在,若已存在,则不会重复插入。数据结构typedef struct _GStringChunk GStringChunk;字符串块是一个不透明的数据结构,我们可以整体使用它,但无法单独访问其结构体成

2022-03-12 00:10:59 294

原创 4_01_GLib库入门与实践_字符串

简介字符串是一种非常常见的数据类型,为了便于操作字符串,GLib首先将字符串封装成类似C++ CString对象的一个结构体,又对字符串的一系列操作进行了封装,使用起来非常便捷,又避免了很多内存泄露的风险。对非封装的简单字符串的处理见通用工具集章的字符串处理函数一节。数据结构struct GString { gchar *str; //数据,以null结尾,可以作为普通字符串使用 gsize len; //字符串长度,不包括null字节 gsize allocated_len;

2022-03-12 00:10:33 742

原创 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 298

原创 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 913

原创 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 614

原创 3_16_GLib库入门与实践_书签解析

简介GBookmarkFile可以解析、编辑或创建包含URI书签的文件,以及有关URI指向的资源的一些元数据,例如,MIME类型、正在注册书签的应用程序以及应用于表示书签的图标。书签文件(文件名一般是xbel后缀)的语法在Desktop Bookmark Specification中有详细描述,是一种叫做XML Bookmark Exchange Language的语言,由于平时用的较少,这里不再赘述。数据结构GBookmarkFile是一个不透明的数据结构,可以整体引用它,但无法访问其内部变量。t

2022-03-12 00:08:05 335

原创 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 628

原创 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 514

原创 3_13_GLib库入门与实践_命令行解析

简介我们常见的如ls,grep, find等命令,通过–help查看,可以看到它们支持非常多的参数,这说明程序支持的功能非常强大,而且这些参数使得程序弹性更大,也更加灵活。如果我们也想写出这样功能强大的程序,GOption将是一个很好用的功能组件。GOption提供了对程序参数的解析功能,使用GOption可以很方便地创建支持多参数的应用程序。数据结构struct GOptionEntry { const gchar *long_name; // 长参数名 gchar sho

2022-03-12 00:06:47 1356

原创 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 1041

原创 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 703

glib-2.0-demo.zip

《GLib库入门与实践》专栏的配套源码。专栏地址:https://blog.csdn.net/field1003/article/details/123420966。 还在为C语言开发时重复造轮子苦恼吗,链表、队列、线程池,统统都得自己实现?先了解一下GLib-2.0库。 GLib库是用C语言实现的一个通用的、可移植的实用程序库,由GNOME的GTK小组开发并维护,最早用在GTK+程序开发上,后来被越来越多的程序使用。 GLib由三大部分组成——GLib、GObject和GIO,GLib是一套C语言工具集,GObject是基于C语言实现的对象系统,GIO是基于GObject的一套简单易用的VFS接口。 GLib包含了字符串操作、文件操作、数据校验、编解码、字符集转换、随机数生成器、命令行解析器、xml解析器、正则表达式、单链表、双链表、 数组、指针数组、双端队列、哈希表、平衡二叉树、N维树、泛型、主循环、多线程、线程池、异步队列、内存分配、内存片段、错误系统、测试框架等等一系列功能,称得上是C语言开发人员的军刀,值得研究。

2022-03-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除