ETJava Beta | Java    注册   登录
  • 搜索:
  • apr库编译及队列使用笔记

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/MikeZhang/p/18378340/aprQueueTest20240824
    如有侵权 请联系我们删除  (页面底部联系我们)  

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

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