apr库编译及队列利用条记

打印 上一主题 下一主题

主题 923|帖子 923|积分 2769

操纵系统 :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库

安装依赖:
  1. yum install expat-devel
复制代码
apr库静态编译:
  1. cd apr-1.7.4
  2. ./configure --enable-static
  3. make
复制代码
apr-util库静态编译(需要指定apr库的地址):
  1. cd ../apr-util-1.6.3
  2. ./buildconf --with-apr=/root/test/aprTest1/apr-1.7.4
  3. ./configure --with-apr=/root/test/aprTest1/apr-1.7.4
  4. make
复制代码
也可利用自动编译脚本,示例如下:
  1. #! /bin/bashbaseDir=$PWDcd apr-1.7.4
  2. ./configure --enable-static
  3. makecd $baseDir/apr-util-1.6.3./buildconf --with-apr=$baseDir/apr-1.7.4./configure --with-apr=$baseDir/apr-1.7.4make
复制代码
三、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
数据结构界说:
  1. struct apr_queue_t {
  2.     void              **data;
  3.     unsigned int        nelts; /**< # elements */
  4.     unsigned int        in;    /**< next empty location */
  5.     unsigned int        out;   /**< next filled location */
  6.     unsigned int        bounds;/**< max size of queue */
  7.     unsigned int        full_waiters;
  8.     unsigned int        empty_waiters;
  9.     apr_thread_mutex_t *one_big_mutex;
  10.     apr_thread_cond_t  *not_empty;
  11.     apr_thread_cond_t  *not_full;
  12.     int                 terminated;
  13. };
复制代码
2、函数列表


  • apr_queue_create
创建队列,界说如下:
  1. 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
向队列添加数据,如果队列满的话会壅闭,界说如下 :
  1. APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);
复制代码
参数说明:
queue :需要添加数据的队列指针
data :数据的指针

  • apr_queue_pop
从队列取出数据,如果队列为空则壅闭,界说如下:
  1. APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);
复制代码
参数说明:
queue :需要获取数据的队列指针
data :数据存放地址的指针

  • apr_queue_trypush
向队列添加数据,如果队列满的话立即返回,界说如下:
  1. APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);
复制代码
参数说明:
queue :需要添加数据的队列指针
data :数据的指针

  • apr_queue_trypop
从队列取出数据,如果队列为空则立即返回,界说如下:
  1. APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);
复制代码
参数说明:
queue :需要获取数据的队列指针
data :数据存放地址的指针

  • apr_queue_size
获取队列的大小,该函数非线程安全,界说如下:
  1. APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);
复制代码

  • apr_queue_interrupt_all    
中断壅闭此队列的所有线程,界说如下:
  1. APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);
复制代码

  • apr_queue_term
终止队列,向所有壅闭线程发送中断指令,界说如下:
  1. APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);
复制代码
3、利用示例

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

完整代码可从如下渠道获取:关注微信公众号(聊聊博文,文末可扫码)后回复 20240824 获取。编译下令:
  1. 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,内容如下:
[code]CC=gccCFLAGS=-g -Wall -fpermissive -Iapr-1.7.4/include -Iapr-util-1.6.3/includeLIBS=-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 -lpthreadall:    make aprTest1aprTest1: aprTest1.o    $(CC) -o aprTest1 aprTest1.o $(CFLAGS) $(LIBS)clean:    rm -f aprTest1    rm -f *.o.cpp.c.o:    $(CC) $(CFLAGS) -c -o $*.o $

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表