apr库编译及队列使用笔记
操作系统 :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简介及资源获取

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):

编译命令:
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
运行效果如下:

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

好,就这么多了,别忘了点赞哈!
apr库编译及队列使用笔记的更多相关文章
- 在windows上编译apr库
环境: win7_x64旗舰版.VS2015企业版.CMake3.8 一.下载apr相关库 1.1)expat下载地址:https://github.com/libexpat/libexpat/rel ...
- 支持源码单步调试QT库编译笔记
支持源码单步调试QT库编译笔记 编译环境:windows 10 编译工具:mingw_4_4_0 Qt源码版本:qt-everywhere-opensource-src-4.8.5(下载地址:http ...
- apache apr的编译和引用
各种巧合吧,需要从JAVA转C,经过这一段时间的心理折磨,还是决定先把精力放到C上. 想快速的提高自己,学习相关语言的经典的源码是唯一的“捷径”,从Apache apr开始吧. 一.下载源代码 官网地 ...
- linux下P2P协议(BitTorrent)-libtorrent库编译,测试
1.libtorrent 简介,下载和编译 libtorrent简介 libtorrent是功能齐全的C ++ bittorrent的p2p协议实现,专注于效率和可伸缩性.它可以在嵌入式设备和台式机上 ...
- freeswitch APR库线程读写锁
概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. 线程读写锁在多线程服务中有重要的作用.对于读数据比写数据频繁的服务,用读写锁代替互斥锁可以提高效率. 由于A ...
- 将STM32的标准库编译成lib使用【图文】
以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间.每次建立工程都这么编译,是一个相当浪费时 ...
- 将STM32的标准库编译成lib
转载自:http://www.cnblogs.com/zyqgold/p/3189719.html 以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这 ...
- iOS之 PJSIP静态库编译(三)
dada哪个所有静态库编译完成后还是不能运行那个demo,提示你找不到arm**.a 你lipo后要记得吧合并成.a 名字更改成你最后编译版本生成的.a名字....... 或者吧所有库add到你的工 ...
- iOS之 PJSIP静态库编译(一)
首先放上pjsip官方网站http://www.pjsip.org/download.htm 下载的时候注意while the .bz2 has LF line-ends and is for Uni ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
随机推荐
- 高通Android平台 电池 相关配置
背景 在新基线上移植有关的代码时,在log中发现有关的东西,请教了有关的同事以后,解决了这个问题. [ 12.775863] pmi632_charger: smblib_eval_chg_termi ...
- Unity 中使用Geomotry Shader(几何着色器)扩展点创建其他图形(并实现处理锯齿)
问题背景: 我们开发中需要有"点"对象,可以是像素的(不具备透视效果),始终等大,还有就是3D场景下的矢量点(随相机距离透视变化的). 问题解决思路: 方案1:使用GS扩充顶点,并 ...
- linux 清理 pyinstaller 打包程序运行留下的临时文件
前言 pyinstaller 打包的 python 二进制可执行程序运行的时候,会在 /tmp 目录下生成 _MEI* (*指的是随机数字)文件夹, 如果程序没有正常退出或者终止了,_MEI* 文件夹 ...
- Java开发常见问题分析和处理方案
程序Bug的产生,通常分为三种类型 逻辑漏洞: 低级错误,程序执行后无法达到想要效果. 越界访问: 访问了非法区域,造成程序崩溃. 条件考虑不全面: 你以为你万无一失,但你永远都不知道输入参数究竟是什 ...
- Servlet之Request和Response的快速上手
阅读提示: 前置内容 MyBatis知识点总结 HTTP和Servlet入门 目录 1.Request和Response概述 2.Request对象 2.1 Request继承体系 2.2 Reque ...
- java 类的执行顺序
java代码 package net.cybclass.sp; public class Test01 { public static void main(String[] args) { new c ...
- Java-JDBC的对象DriverManager,Connection,ResultSet,PreparedStatement,工具类:JDBCUTILS,JDBC控制事务
1. 概念 Java DataBase Connectivity Java 数据库连接 Java语言操作数据库 JDBC本质:其实是官方(sun)公司的一套操作所有关系型数据库的规则,即接口.各个数据 ...
- 在该serializer中使用source参数指定序列化时使用的字段的choices选项
在序列化中获取time_unit字段的中文名称,你可以使用choices选项中定义的第二个值,即元组中的第二个元素.你可以通过定义一个serializer,然后在该serializer中使用sourc ...
- 我从 Python 潮流周刊提取了 800 个链接,精选文章、开源项目、播客视频集锦
你好,我是豌豆花下猫.前几天,我重新整理了 Python 潮流周刊的往期分享,推出了第 1 季的图文版电子书,受到了很多读者的一致好评. 但是,合集和电子书的篇幅很长,阅读起来要花不少时间.所以,为了 ...
- [rCore学习笔记 017]实现批处理操作系统
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 本章目 ...