可以看到apache代码中使用了大量的以apr_开头的结构或者函数,这些其实是APR.
什么是apr?
我的理解是apache工作小组在编写apache等C程序过程中所积累的一套编程框架, 里面提供比较先进的内存管理模式和常用的数据结构,另外根据各种平台作了一些不同的宏定义,让代码做到平台无关性。由于做得不错,后来,就干脆把它从apache源代码中脱离出来,又搞了一个项目,apache官方站点上也有它的相关介绍:http://apr.apache.org/
The mission of the Apache Portable Runtime (APR) project is to create and maintain software libraries that provide a predictable and consistent interface to underlying platform-specific implementations. The primary goal is to provide an API to which software developers may code and be assured of predictable if not identical behaviour regardless of the platform on which their software is built, relieving them of the need to code special-case conditions to work around or take advantage of platform-specific deficiencies or features.
apr可以独立于apache安装,让我们编写应用程序时也使用。
有个非常好的英文文档介绍了怎么样使用:http://dev.ariel-networks.com/ap ... l/apr-tutorial.html
上面那个文档非常不错,大家看懂了,我写的这篇就不用看了。
我这个把几个以后经常要用到的介绍一下。
(1) apr_pool_t *pool
内存池,所有的内存操作可以基于这个池之上,当这个池不再需要时,一次性释放该池上的所有内存,这个模式非常适合基于session服务的编程模式, 比如:每个http request都分配一个apr_pool_t,当该http request end时,一次性释放该request运行时申请的所有内存。可以看到struct request_rec中就有这个东东。
用法:
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
char *buf1;
buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
for (i = 0; i < n; ++i) {
do_operation(..., mp);
apr_pool_clear(mp);
}
apr_pool_destroy(mp);
(2)数据结构--容器
动态数组---apr_array_header_t
类似于hashmap的apr_table_t:
apr_table_t *tab;
tab = apr_table_make(mp, 5);
apr_table_setn(tab, "foo", "bar");
apr_table_setn(tab, apr_pstrdup(mp, "foo"), apr_pstrdup(mp, "bar"));
const char *v = apr_table_get(tab, "mykey");
可以看到apr_table_t存储key-value pairs类型的数据非常方便,难怪apache所有的http header都用它存储。
其他操作apr_table_t的函数:
APR_DECLARE(const apr_array_header_t *) apr_table_elts(const apr_table_t *t);
APR_DECLARE(int) apr_is_empty_table(const apr_table_t *t);
APR_DECLARE(int) apr_is_empty_array(const apr_array_header_t *a);
APR_DECLARE(apr_array_header_t *) apr_array_make(apr_pool_t *p,
int nelts, int elt_size);
APR_DECLARE(void *) apr_array_push(apr_array_header_t *arr);
APR_DECLARE(void *) apr_array_pop(apr_array_header_t *arr);
APR_DECLARE(void) apr_array_cat(apr_array_header_t *dst,
const apr_array_header_t *src);
APR_DECLARE(apr_array_header_t *) apr_array_copy(apr_pool_t *p,
const apr_array_header_t *arr);
APR_DECLARE(apr_array_header_t *) apr_array_copy_hdr(apr_pool_t *p,
const apr_array_header_t *arr);
APR_DECLARE(apr_array_header_t *) apr_array_append(apr_pool_t *p,
const apr_array_header_t *first,
const apr_array_header_t *second);
APR_DECLARE(char *) apr_array_pstrcat(apr_pool_t *p,
const apr_array_header_t *arr,
const char sep);
APR_DECLARE(apr_table_t *) apr_table_make(apr_pool_t *p, int nelts);
APR_DECLARE(apr_table_t *) apr_table_copy(apr_pool_t *p,
const apr_table_t *t);
APR_DECLARE(void) apr_table_clear(apr_table_t *t);
APR_DECLARE(const char *) apr_table_get(const apr_table_t *t, const char *key);
APR_DECLARE(void) apr_table_set(apr_table_t *t, const char *key,
const char *val);
APR_DECLARE(void) apr_table_setn(apr_table_t *t, const char *key,
const char *val);
APR_DECLARE(void) apr_table_unset(apr_table_t *t, const char *key);
APR_DECLARE(void) apr_table_merge(apr_table_t *t, const char *key,
const char *val);
APR_DECLARE(void) apr_table_mergen(apr_table_t *t, const char *key,
const char *val);
APR_DECLARE(void) apr_table_add(apr_table_t *t, const char *key,
const char *val);
APR_DECLARE(void) apr_table_addn(apr_table_t *t, const char *key,
const char *val);
APR_DECLARE(apr_table_t *) apr_table_overlay(apr_pool_t *p,
const apr_table_t *overlay,
const apr_table_t *base);
typedef int (apr_table_do_callback_fn_t)(void *rec, const char *key,
const char *value);
APR_DECLARE_NONSTD(int) apr_table_do(apr_table_do_callback_fn_t *comp,
void *rec, const apr_table_t *t, ...);
APR_DECLARE(int) apr_table_vdo(apr_table_do_callback_fn_t *comp,
void *rec, const apr_table_t *t, va_list vp);
#define APR_OVERLAP_TABLES_SET (0)
#define APR_OVERLAP_TABLES_MERGE (1)
APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b,
unsigned flags);
APR_DECLARE(void) apr_table_compress(apr_table_t *t, unsigned flags);
其他apr提供的数据结构还有:hash和list,这里不再详述。
(3) 字符串操作
写过C的人都知道,处理字符串是非常头痛的问题,搞不好就内存溢出,apr也提供一些字符串函数,都是基于apr_pool_t, 使用时不用担心内存溢出的问题。
把apr_strings.h贴出来大家一起看看,注释也比较详细,不多说:
APR_DECLARE(int) apr_strnatcmp(char const *a, char const *b);
APR_DECLARE(int) apr_strnatcasecmp(char const *a, char const *b);
APR_DECLARE(char *) apr_pstrdup(apr_pool_t *p, const char *s);
APR_DECLARE(char *) apr_pstrmemdup(apr_pool_t *p, const char *s, apr_size_t n);
APR_DECLARE(char *) apr_pstrndup(apr_pool_t *p, const char *s, apr_size_t n);
APR_DECLARE(void *) apr_pmemdup(apr_pool_t *p, const void *m, apr_size_t n);
分享到:
相关推荐
这在很大程度上帮助开发人员克服了C语言编程的缺陷,特别是交叉编译平台和资源管理方面的缺陷。通过使用Apache 2,C程序员可以达到通常被认为是高层次语言和脚本语言才能达到的高效率。 新的拓展架构带来了全新层次...
本文将详细介绍如何为Apache 2.0开发一个名为 `mod_hello` 的自定义模块,该模块的功能是读取配置文件中的特定设置,并针对URL路径中以 `.hello` 结尾的请求进行处理。 #### 二、开发环境与准备 为了开发Apache ...
Apache模块是Apache HTTP服务器的核心功能扩展,通过编写C语言代码并编译成动态链接库(.so或.dll),我们可以实现自定义的Web服务功能。在本范例中,我们将使用Visual Studio 2017(VS2017)作为开发环境来创建一个...
我在改造APACHE服务器授权访问时,需要对不合法的客户端请求进行过滤。对不合法请求需要立即发送一个错误提示页面给客户端。 发送错误提示页面的程序片断如下: //非法请求作错误跳转 char *location...
在Linux系统中安装Apache2是一项基础且重要的任务,它涉及到一系列的依赖库和配置过程。在提供的资源中,我们有以下关键组件: 1. **apr-1.6.3.tar.gz**:Apache Portable Runtime (APR) 是Apache HTTP服务器项目的...
标题中的"The APR based Apache Tomcat Native library"是指Apache Portable Runtime(APR)库的一个组件,即Apache Tomcat Native库。这个库是专门为Apache Tomcat设计的,目的是为了提高其在处理网络I/O、系统调用...
Apache服务器是全球最广泛使用的Web服务器,其稳定性和可扩展性深受开发者喜爱。在构建和维护Apache服务器时,经常会遇到各种依赖包,其中`apr-1.4.6.tar.gz`是一个关键组件,它是Apache Portable Runtime( APR)的...
2. **apr1.5.1.tar.gz**: APR(Apache Portable Runtime)是Apache项目的基石,提供操作系统级别的接口,包括文件I/O、网络连接、内存管理等。apr1.5.1是该库的一个版本,它保证了Apache在不同操作系统上的可移植性...
3. **编译和安装**:执行`make`命令进行编译,然后用`make install`将编译好的Apache二进制文件安装到系统指定的目录,通常是`/usr/local/apache2`。 4. **配置Apache**:编辑Apache的配置文件(如`httpd.conf`),...
Apache Portable Runtime(简称APR)是Apache HTTP服务器项目的一个核心组件,它为各种操作系统提供了统一的接口,使得开发者可以编写跨平台的C语言程序。APR不仅被用于Apache HTTP服务器,也被其他开源软件如Tomcat...
1. **APR (Apache Portable Runtime)**:APR 是一个C语言编写的库,它的设计目标是提供一个跨平台的系统接口层,隐藏不同操作系统之间的差异。它提供了诸如文件I/O、网络通信、内存管理、进程和线程操作等基础功能。...
2. **APR(Apache Portable Runtime)**: APR是Apache项目的基础库,它为各种操作系统提供了统一的接口,包括文件操作、网络通信、内存管理等。APR的目的是使Apache服务器和其他基于APR的应用程序在不同平台上具有良好...
Apache2是世界上最流行的Web服务器软件之一,其稳定性和可扩展性深受广大用户的喜爱。SSL(Secure Sockets Layer)是用于在互联网上实现安全通信的一种协议,它可以加密传输数据,保护用户的隐私信息。当配置Apache2...
3. **头文件**:包含了APR和APR-utils的C语言头文件,供需要直接编译与APR交互的C/C++代码使用。 4. **配置文件**:可能包含关于如何配置APR的设置,例如路径和日志配置。 在安装或更新Apache Tomcat时,如果选择...
标题中的"apr_1.5&apr_util_1.5.4"指的是Apache Portable Runtime (APR)的1.5版本及其配套库APR-Util的1.5.4版本。这两个组件是Apache软件基金会项目的重要组成部分,尤其在构建和运行Apache HTTP服务器时不可或缺。...
APR 是一个由Apache软件基金会开发的C语言库,它提供了与操作系统交互的一致接口,包括文件I/O、网络通信、内存管理等功能,从而使得服务器软件可以在不同的操作系统上运行。本文将详细介绍如何下载、编译和安装apr-...
7. **apr-util-1.6.1.tar.gz**: APR-Util是APR的扩展库,提供数据库接口、加密函数、XML解析等功能,增强了Apache的实用性和灵活性。 8. **mod_wsgi-4.7.1.tar.gz**: mod_wsgi是Apache的一个模块,用于托管Python ...
这个压缩包包含Subversion的源代码以及其依赖的Apache Portable Runtime (APR) 和 APR Util库,还有SQLite数据库引擎的集成代码。 Apache Portable Runtime (APR) 是一个C语言库,它是Apache HTTP服务器项目的基础...