首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

apr库编译及队列使用笔记

编程知识
2024年08月24日 21:07

操作系统 :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 获取。

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

From:https://www.cnblogs.com/MikeZhang/p/18378340/aprQueueTest20240824
本文地址: http://www.shuzixingkong.net/article/1412
0评论
提交 加载更多评论
其他文章 讲讲Java的序列化反序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 什么时候会用到 当只在本地 JVM 里运行下 Java 实例,这个时候是不需要什么序列化和反序列化的,但当出现以下场景时,就需要序列化和反序列化了: 当需要将内存中的对象持久化到磁盘,数据
玄机蓝队靶场_应急响应_02:apache日志分析
日志分析这块,感觉都是对grep、awk、sort、wc、uniq,这几个命令的使用。 一:靶场 (1)直接cd到linux日志, cd /var/log 发现apache2目录, cd ./apache2 里边只有两种类型的日志,access.log和error.log。 access.log(访
.NET 音频采集
本文介绍Windows下声音数据的采集,用于本地录音、视讯会议、投屏等场景 声音录制有麦克风、扬声器以及混合录制三类方式,麦克风和扬声器单独录制的场景更多点,混合录制更多的是用于本地录音 我们基于NAudio实现,开源组件NAudio已经很稳定的实现了各类播放、录制、转码等功能,WaveIn,Wav
CSP-J 第一轮 2024模拟卷-1
单项选择题 我只写重点!!! 第四题 NOI复赛评测机所用的Linux系统属于() A.UML B.IDE C.OS D.Database 答案:C 解析:UML是一种建模语言,IDE是集成开放环境,Database是数据库,NOI复赛评测机所用的Linux系统属于OS(Operating Syst
Transformer模型:Position Embedding实现
在自然语言处理(NLP)中,Transformer 模型是一个非常重要的里程碑,它通过自注意力(self-attention)机制极大地提高了处理序列数据的能力。在 Transformer 模型中,词嵌入(Word Embedding)是输入层的关键部分,负责将离散的单词转换成连续的向量表示,以便模
全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列
在 Python 中,列表(list)是一种非常灵活的数据结构,可以用来实现堆栈(stack)、队列(queue)和双端队列(deque)。这些数据结构虽然在使用时遵循不同的操作规则,但都可以通过 Python 列表来高效地实现。
全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列 全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列 全网最适合入门的面向对象编程教程:38 Python常用复合数据类型-使用列表实现堆栈、队列和双端队列
程序员:全栈的痛你不知道
我这里说的全栈,不只是IT技术栈,还有更多的是产品运营思维。任何时候全栈人都应该用解决问题、推动事情往前发展的思维去做事。
程序员:全栈的痛你不知道
使用C#爬取快手作者主页,并下载视频/图集
最近发现一些快手的作者,作品还不错,出于学习研究的目的,决定看一下怎么爬取数据。现在网上有一些爬虫工具,不过大部分都失效了,或者不开源。于是自己就写了一个小工具。先看一下成果: 软件只需要填写作者uid以及网页版的请求Cookie,即可实现自动下载,下载目录在程序根目录下的Download文件夹。
使用C#爬取快手作者主页,并下载视频/图集 使用C#爬取快手作者主页,并下载视频/图集 使用C#爬取快手作者主页,并下载视频/图集