首页 > 其他分享 >apr库编译及队列使用笔记

apr库编译及队列使用笔记

时间:2024-08-24 22:05:22浏览次数:8  
标签:util 1.6 1.7 编译 apr queue 队列

操作系统 :CentOS 7.9_x64

apr库版本:apr-1.7.4 & apr-util-1.6.3

gcc 版本:4.8.5

队列功能在C++或Python等脚本语言里面,是很容易就可以使用的,但C语言里面,标准库里面没有。

在使用C语言开发新应用时,就会遇到这个问题。阅读FreeSWITCH源码,发现使用的是apr库,一个强大的开发库,提供了一套跨平台的底层接口,里面就有队列功能。

今天记录下CentOS7环境下如何编译apr库及使用队列的笔记,并提供相关运行效果和资源下载。

我将从以下几个方面进行展开:

  • apr简介及资源获取

  • apr库的编译

  • apr队列介绍及使用示例

  • 配套资源下载

一、apr简介及资源获取

官网:https://apr.apache.org/

APR的全称是:

Apache portable Run-time libraries(Apache可移植运行库)

主要为上层应用程序提供一个跨操作系统的底层接口,主要由三个库构成:

1、apr库

文档地址:https://apr.apache.org/docs/apr/1.7/

 

包含通用的开发组件,涉及文件IO、内存池、哈希表、内存映射文件、进程和线程操作、网络IO等。

下载地址:

https://dlcdn.apache.org//apr/apr-1.7.4.tar.gz

如果下载过慢,可从文末提供的渠道获取。

2、apr-util库

文档地址:https://apr.apache.org/docs/apr-util/1.6/

 一些常用的开发组件,涉及线程池、队列等。

下载地址:

https://dlcdn.apache.org//apr/apr-util-1.6.3.tar.gz

如果下载过慢,可从文末提供的渠道获取。

3、apr-iconv库

文档地址:

https://apr.apache.org/docs/apr-iconv/1.2/index.html

 主要用于实现iconv编码(本文不涉及该部分)。

下载地址:

https://dlcdn.apache.org//apr/apr-iconv-1.2.2.tar.gz

如果下载过慢,可从文末提供的渠道获取。

二、编译apr及apr-util库

安装依赖:

yum install expat-devel

apr库静态编译:

cd apr-1.7.4
./configure --enable-static
make

apr-util库静态编译(需要指定apr库的地址):

cd ../apr-util-1.6.3
./buildconf --with-apr=/root/test/aprTest1/apr-1.7.4
./configure --with-apr=/root/test/aprTest1/apr-1.7.4
make

也可使用自动编译脚本,示例如下:

#! /bin/bash

baseDir=$PWD

cd apr-1.7.4
./configure --enable-static
make

cd $baseDir/apr-util-1.6.3
./buildconf --with-apr=$baseDir/apr-1.7.4
./configure --with-apr=$baseDir/apr-1.7.4
make

三、apr队列介绍及使用示例

apr队列是个线程安全的FIFO队列。
文档地址:

https://apr.apache.org/docs/apr-util/1.6/group___a_p_r___util___f_i_f_o.html

 1、头文件及数据结构

头文件:apr-util-1.6.3/include/apr_queue.h

数据结构定义:

struct apr_queue_t {
    void              **data;
    unsigned int        nelts; /**< # elements */
    unsigned int        in;    /**< next empty location */
    unsigned int        out;   /**< next filled location */
    unsigned int        bounds;/**< max size of queue */
    unsigned int        full_waiters;
    unsigned int        empty_waiters;
    apr_thread_mutex_t *one_big_mutex;
    apr_thread_cond_t  *not_empty;
    apr_thread_cond_t  *not_full;
    int                 terminated;
};

2、函数列表

  • apr_queue_create

创建队列,定义如下:

APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue,unsigned int queue_capacity,apr_pool_t *a);

参数说明:
queue :需要初始化的队列地址的指针
queue_capacity :队列大小
a :apr内存池地址

  • apr_queue_push

向队列添加数据,如果队列满的话会阻塞,定义如下 :

APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);

参数说明:
queue :需要添加数据的队列指针
data :数据的指针

  • apr_queue_pop

从队列取出数据,如果队列为空则阻塞,定义如下:

APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);

参数说明:
queue :需要获取数据的队列指针
data :数据存放地址的指针

  • apr_queue_trypush

向队列添加数据,如果队列满的话立即返回,定义如下:

APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);

参数说明:
queue :需要添加数据的队列指针
data :数据的指针

  • apr_queue_trypop

从队列取出数据,如果队列为空则立即返回,定义如下:

APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);

参数说明:
queue :需要获取数据的队列指针
data :数据存放地址的指针

  • apr_queue_size

获取队列的大小,该函数非线程安全,定义如下:

APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);
  • apr_queue_interrupt_all    

中断阻塞此队列的所有线程,定义如下:

APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);
  • apr_queue_term

终止队列,向所有阻塞线程发送中断指令,定义如下:

APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);

3、使用示例

这里提供一个使用示例,代码如下(aprTest1.c):

完整代码可从如下渠道获取: 关注微信公众号(聊聊博文,文末可扫码)后回复 20240824 获取。

编译命令:

gcc -g aprTest1.c -o aprTest1  -Iapr-1.7.4/include -Iapr-util-1.6.3/include apr-util-1.6.3/.libs/libaprutil-1.a  apr-1.7.4/.libs/libapr-1.a -lpthread

编译及运行效果如下:

 也可使用Makefile,内容如下:

CC=gcc
CFLAGS=-g -Wall -fpermissive -Iapr-1.7.4/include -Iapr-util-1.6.3/include
LIBS=-lpthread apr-util-1.6.3/.libs/libaprutil-1.a apr-1.7.4/.libs/libapr-1.a

# gcc -g aprTest1.c -o aprTest1  -Iapr-1.7.4/include -Iapr-util-1.6.3/include apr-util-1.6.3/.libs/libaprutil-1.a  apr-1.7.4/.libs/libapr-1.a -lpthread

all:
    make aprTest1

aprTest1: aprTest1.o
    $(CC) -o aprTest1 aprTest1.o $(CFLAGS) $(LIBS)

clean:
    rm -f aprTest1
    rm -f *.o

.cpp.c.o:
    $(CC) $(CFLAGS) -c -o $*.o $<

apr库及程序的自动编译脚本如下(doBuild.sh):

#! /bin/bash

baseDir=$PWD

cd apr-1.7.4
./configure --enable-static
make

cd $baseDir/apr-util-1.6.3
./buildconf --with-apr=$baseDir/apr-1.7.4
./configure --with-apr=$baseDir/apr-1.7.4
make

cd $baseDir
make
#gcc -g aprTest1.c -o aprTest1  -Iapr-1.7.4/include -Iapr-util-1.6.3/include apr-util-1.6.3/.libs/libaprutil-1.a  apr-1.7.4/.libs/libapr-1.a

运行效果如下:

 

四、资源下载

本文涉及源码及相关文件,可从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240824 获取。

 好,就这么多了,别忘了点赞哈!

标签:util,1.6,1.7,编译,apr,queue,队列
From: https://www.cnblogs.com/MikeZhang/p/18378340/aprQueueTest20240824

相关文章

  • 怎样解决线上消息队列积压问题
    目录引言消息积压的原因解决方案Kafka消息积压引言提到消息队列,最常问到的问题就是消息积压,真实线上环境该怎么解决消息积压的问题?真实情况并不是网上说的把积压的消息投递到一个新Topic中,然后慢慢消费。这样做,成本太高、流程复杂、操作麻烦,而且还是一次性操作,不可持续,下次再出......
  • STL、字符串、字符的函数、队列
     vector,变长数组,倍增的思想size()//返回元素个数empty()//返回是否为空clear()//清空front()/back()//开头/结尾push_back()/pop_back()//输入/删除首个begin()/end()迭代器=find(a.begin(),a.end(),x);string,字符串siz......
  • Ros2 Moveit2 编译安装报错解决方案 - By not providing "Findgz_sim_vendor.cmake" i
    moveit_resources---stderr:gz_ros2_controlCMakeErroratCMakeLists.txt:27(find_package):Bynotproviding"Findgz_sim_vendor.cmake"inCMAKE_MODULE_PATHthisprojecthasaskedCMaketofindapackageconfigurationfileprovidedby"gz......
  • 实验1 熟悉 VIVADO 编译环境
    一 实验目的1.熟悉VIVADO的编译环境2.熟悉在VIVADO 环境下运用VerilogHDL 语言的编程开发流程,包括源程序的编写、编译、模拟仿真及程序下载。二  实验内容1.VIVADO环境下源程序的编写、编译2.模拟仿真3.程序下载三  实验要求1.在VIVADO环境下完成三人表决......
  • 通过队列通信实现红外遥控、旋转编码器和MPU6050数据处理的打砖块游戏开发
     声明:项目源码参考韦东山老师百问网嵌入式专家-韦东山嵌入式专注于嵌入式课程及硬件研发(100ask.net)        在本项目中,打砖块游戏的核心逻辑在一个单独的任务中实现,同时系统还需要处理来自红外遥控、旋转编码器和MPU6050传感器的数据输入。为此,使用FreeRTOS的队列......
  • 【CUDA编程笔记】thrust::device_vector<float> signal无法编译问题记录
    thrust::device_vectorsignal无法编译问题记录CUDA编程笔记一、问题记录正常编译时,无法编译二、源码#include<thrust/host_vector.h>#include<thrust/device_vector.h>#include<thrust/generate.h>#include<thrust/sort.h>#include<thrust/copy.h>#includ......
  • [Redis]消息队列
    Redis如何实现消息队列1、使用ListList最为简单和直接,主要通过lpush、rpop存储和读取消息队列的(先进先出)ruby代码解读复制代码127.0.0.1:6379>lpushmq"firstMsg"#推送消息firstMsg(integer)1127.0.0.1:6379>lpushmq"secondMsg"#推送消息secondMsg(integer)212......
  • [消息队列]kafka
    Kafka如何保证消息的消费顺序?我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了2个消息,这2个消息对应的操作分别对应的数据库操作是:更改用户会员等级。根据会员等级计算订单价格。假如这两条消息的消费顺序不一样造成的最终结果就会......
  • 数据结构day04(队列 Queue 循环队列、链式队列)
    目录【1】队列Queue1》队列的定义 2》循环队列3》链式队列 【1】队列Queue1》队列的定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(FirstInFirstOut)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端......
  • 程序设计语言基础-编译过程概述+表达式
    程序设计语言分类面向机器的语言由0、1组成的机器指令序列或汇编语言(如:moveax,bx),可读性差,难以修改和维护。面向应用程序的语言如,Java、C、C++、Python、Delphi、PASCAL等,更接近人类语言,提高程序设计效率。程序设计语言分类生成目标代码过程编译程序词法分析输入源程......