APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称同样,主要为上层的应用程序提供一个能够跨越多操做系统平台使用的底层支持接口库。在早期 的Apache版本中,应用程序自己必须可以处理各类具体操做系统平台的细节,并针对不一样的平台调用不一样的处理函数。html
随着Apache的进一步开 发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。目前APR主要仍是由Apache使用,不过因为APR的较好的移植性,所以一些须要进行移植的C程序也开始使用APR,开源项目好比 Flood loader(http://httpd.apache.org/test/flood/,该项目用于服务器压力测试,不单单适用于Apache)、FreeSwitch(www.freeswitch.org),JXTA-C(http://jxta-c.jxta.org,C版本的JXTA点对点平台实现);商业的项目则包括Blogline(http://www.bloglines.com/,covalent(http://www.covalent.net)等等。apache
APR使得平台细节的处理进行下移。对于应用程序而言,它们根本就不须要考虑具体的平台,无论是Unix、Linux仍是Window,应用程序执行的接口基本都是统一一致的。所以对于APR而言,可移植性和统一的上层接口是其考虑的一个重点。而APR最先的目的并非如此,它最先只是但愿将Apache中用到的全部代码合并为一个通用的代码库,然而这不是一个正确的策略,所以后来APR改变了其目标。有的时候使用公共代码并非一件好事,好比如何将一个请求映射到线程或者进程是平台相关的,所以仅仅一个公共的代码库并不能完成这种区分。APR的目标则是但愿安全合并全部的可以合并的代码而不须要牺牲性能。数组
APR的最先的一个目标就是为全部的平台(不是部分)提供一个公共的统一操做函数接口,这是一个很是了不得的目的,固然也是不现实的一个目标。咱们不可能支持全部平台的全部特征,所以APR目前只能为大多数平台提供全部的APR特性支持,包括Win32、OS/2、BeOS、Darwin、Linux等等。为了可以实现这个目标,APR开发者必须为那些不能运行于全部平台的特性建立了一系列的特征宏(FEATURE MACROS)以在各个平台之间区分这些特征。这些特征宏定义很是简单,一般用APR_HAS_FEATURE参数设置:安全
若是某个平台具备这个特性,则该宏必须设置为true,好比Linux和window都具备内存映射文件,同时APR提供了内存映射文件的操做接口,所以在这两个平台上,APR_HAS_MMAP宏必须设置,同时ap_mmap_*函数应该将磁盘文件映射为内存并返回适当的状态码。若是你的操做系统并不支持内存映射,那么APR_HAS_MMAP必须设置为0,并且全部的ap_mmap_*函数也能够不须要定义。第二步就是对于那些在程序中使用了不支持的函数必须提出警告。服务器
目前APR中支持的基本类型包括下面几种:网络
表3-1 APR中支持的基本类型并发
类型名称dom |
文件夹名称函数 |
描述性能 |
atomic |
/apr/atomic |
原子操做 |
dso |
/apr/dso |
动态加载共享库 |
file io |
/apr/file_io |
文件IO处理 |
mmap |
/apr/mmap |
内存映射文件 |
locks |
/apr/locks |
进程和线程互斥锁 |
memory |
/apr/memory |
内存池操做 |
network_io |
/apr/network_io |
网络IO处理 |
poll |
/apr/poll |
轮询IO |
table |
/apr/tables |
Apache数组(堆栈)和表格以及哈希表 |
process |
/apr/threadproc |
进程和线程操做 |
user |
/apr/user |
用户和用户组操做 |
time |
/apr/time |
时间操做 |
string |
/apr/strings |
字符串操做 |
password |
/apr/passwd |
终端密码处理 |
misc |
/apr/misc |
大杂烩,不属于其他类的任何apr类型均可以放在里面 |
shmem |
/apr/shmem |
共享内存 |
random |
/apr/random |
随机数生成库 |
http://labs.mop.com/apache-mirror//apr/apr-1.4.6.tar.gz
http://labs.mop.com/apache-mirror//apr/apr-util-1.4.1.tar.gz
http://labs.mop.com/apache-mirror//apr/apr-iconv-1.2.1.tar.gz