Apache模块开发指南-APR池
转:原文: http://blog.csdn.net/zmxiangde_88/article/details/8038150
-------------------------------------------------------------------------------
博文主要内容来自APR_POOL的帮助文档
APR的意思是Apache可移植运行库,是Apache portable Run-time Libraries的缩写,主要是为编写上层的应用程序提供一个跨平台使用的接口,在早期的时候,为了应用程序在多个操作系统和平台上能够运行,应用本身需要处理各种具体的细节,针对不同的平台调用不同的处理函数等等,到了今天,这些操作平台之间不同的调用以及细节处理都有一个通用的处理方式,这就是APR库。
在实际的应用程序开发过程中,经常有内存操作,在Apache模块开发时,内存的操作可以通过这个池来完成。就是在需要内存的时候,从这个池上分配,当不再需要使用任何内存时,可以将这个池释放,这样就可以释放这个池上所有的内存(那些被多次分配的,可以一次被释放了,但我们需要为内存注册一个释放内存的操作)。事实上,每个HTTP request结构都有一个apr_pool_t结构实例,后者表示内存池的管理实例,也是Apache中资源管理的核心。
一,三个基本的API
- APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool,
- apr_pool_t *parent);
- APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size);
- APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p);
上面三个API分别表示创建一个APR池,从池中分配内存,释放APR池,是一个内存池的最基本的三个操作。
二,一个例子
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <apr_general.h>
- #include <apr_pools.h>
- #define MEM_ALLOC_SIZE 1024
- /**
- * memory pool sample code
- * @remark Error checks omitted
- */
- int main(int argc, const char *argv[])
- {
- apr_status_t rv;
- apr_pool_t *mp;
- char *buf1;
- char *buf2;
- /* per-process initialization */
- rv = apr_initialize();
- if (rv != APR_SUCCESS) {
- assert(0);
- return -1;
- }
- /* create a memory pool. */
- apr_pool_create(&mp, NULL);
- /* allocate memory chunks from the memory pool */
- buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);
- buf2 = apr_palloc(mp, MEM_ALLOC_SIZE);
- /* destroy the memory pool. These chunks above are freed by this */
- apr_pool_destroy(mp);
- apr_terminate();
- return 0;
- }
上面例子中的,要注意的是rv=apr_initialize()和apr_terminate(),这两个方法相当于初始化APR内部数据结构和结束APR库的使用,apr_initialize()函数必须是第一个被调用的APR库函数。
三,关于apr_pool_clear函数
这个函数和apr_pool_destory函数类似,但它在调用之后,内存池仍然可以使用。
- 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);
四,apr_pool_cleanup_register
一般的从池中分配的内存之后,当内存池被释放时,这块内存也会被自动的回收,也可以调用apr_pool_cleanup_register以显式的指定一个回调函数,当指定的内存被释放时。
如:
- int *value=(int*)malloc(sizeof(int));
- apr_pool_cleanup_register(pool,value,free,apr_pool_cleanup_null);
在这个注册之后,我们不用关心内存是否被释放以及什么时候释放的。当apr_pool_destory(pool)释放内存池时,上面的value指向的内存就会被自动的释放,并且调用free来释放。
Apache模块开发指南-APR池的更多相关文章
- Apache模块开发
一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...
- Apache PDFbox开发指南之PDF文档读取
转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容 ...
- ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)
ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发 ...
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)
原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...
- C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)
C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇) 名词解释:apxs apxs is a tool for building and installi ...
- C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...
- 《Apache HttpClient 4.3开发指南》
转载自:http://blog.csdn.net/chszs/article/details/16854747 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chs ...
- 移动IM开发指南3:如何优化登录模块
<移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...
- 开源项目SMSS开发指南(二)——基于libevent的线程池
libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...
随机推荐
- Java 中数组的遍历方式
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 今天我们就来说一下在java中遍历数组都有哪几 ...
- python抢票开发——设备预约助手实现
女朋友是药学院的,做实验时需要在特定的网站上进行设备预约,由于预约人数过多,从而导致从浏览器登录不进去或者登录进去预约失败等情况,所以我用python帮她写了一个抢位助手,让程序自动去进行位置预定,实 ...
- 微信小程序上传多张图片,及php后台处理
微信小程序上传多张图片,级小程序页面布局直接来代码index.wxml <view class='body' style='width:{{windowWidth}}px;height:{{wi ...
- 汇编程序44:检测点13.1 (jmp near ptr 标号指令的中断例程)
安装程序: assume cs:code //jmp near ptr 标号指令的替代实现,使用iret指令 code segment start: mov ax,cs mov ds,ax mov s ...
- springMVC是什么等七个问题
- vue项目杂记
vue项目杂记 文件目录结构 src main.js app.vue package.json webpack_config_dev.js 需要安装的包 1. vue cnpm i vue --sav ...
- CSS基础知识(定位、浮动)
12.浮动 特点:将当前元素脱离文档流 float: left 即左浮动 float: right 即右浮动 注:*父与子元素,设置子元素浮动不能超出父元素的范围 *多个元素均设置为浮动时,将 ...
- C#使用Win32函数的一些类型转换
C#在访问Win 32 Api时需要处理C 结构与C#结构的映射,这在MSDN以及许多Blog上都可以找到参考的资料.Win 32 中有一些定义复杂的Struct,这些结构体拥有长度固定的数组或者一些 ...
- Nginx 反向代理并缓存及缓存清除
Nginx 反向代理并缓存及缓存清除 原文地址:http://www.cnblogs.com/caoguo/p/5012447.html 一. Nginx 配置 #user nobody; worke ...
- c#遍历注册表
--来自 https://blog.csdn.net/wenchangren/article/details/751863using System; using Microsoft.Win32; us ...