Apache Portable Runtime

概述

Apache可移植运行时( Apache Portable Runtime,简称APR)是Apache HTTP服务器的支持库,提供了一组映射到下层操作系统的API。如果操作系统不支持某个特定的功能,APR将提供一个模拟的实现。这样程序员使用APR编写真正可在不同平台上移植的程序。 最初,APR是作为Apache HTTP服务器的一部分而存在的,但是Apache软件基金会将其延伸成一个单独的项目。其他的应用程序可以使用APR来实现平台无关性。

类似产品:Mozilla跨平台组件模型XPCOM

跨平台组件对象模型(英语:Cross Platform Component Object Model,简称XPCOM)是Mozilla的一个跨平台组件模型。它类似微软的组件对象模型(COM)和公共对象请求代理体系结构(CORBA)。[1]它有多个语言绑定和接口描述语言(IDL)描述符,因此程序员可以将自己的自定义函数插入到框架中并与其他组件连接。

2015年8月,Mozilla宣布将放弃为创建Firefox附加组件而使用的XPCOM,未来将支持WebExtensions。Firefox的分支苍月浏览器(Pale Moon)则将继续无限期的支持XPCOM。

功能特性

Apache可移植运行时提供的一系列平台无关的功能特性包括:
  • 内存管理和内存池功能

  • 原子操作(Linearizability)

  • 动态库处理

  • 文件I/O

  • 命令参数解析

  • 锁机制(Locking)

  • 散列表和数组

  • Mmap(mmap)功能

  • 网络套接字和协议

  • 线程,进程和互斥锁功能

  • 共享内存功能

  • 时间子程序

  • 用户和组ID服务

类似的项目

  • Glib提供类似的功能特性。 支持更多的数据结构和操作系统无关的函数,但进程间通信相关的函数要少一些(Glib缺少本地和全局锁机制以及共享内存管理)。

  • 网景可移植运行时(NSPR)是Mozilla项目所使用的跨平台抽象库。也被Mozilla应用框架(XPFE)的其他子项目所使用,以提供跨平台图形用户界面(GUI)功能特性。

  • 自适配通信环境 (ACE)是用C++编写的功能与APR相似的面向对象库,广泛应用于商业产品。[1]

  • commonc++ 是系统编程的跨平台C++类库,具有许多与APR的相同的特性。

  • POCO(POCO)是概念上与APR类似的现代C++框架,但比APR具有更好的扩展性。

  • WxWidgets是面向对象的跨平台GUI库,也提供数据库通讯,进程间通信和网络的抽象类。

  • Qt是具有类似功能的应用开发框架, 同时支持图形用户界面开发

APR函数库分析

APR函数库教程计划         用作我写书的底稿了。主要是分析APR-1.2.2、APR-1.2.2-util、APR-1.2.2-iconv的源代码并给出相应函数的使用方法,函数库的使用方法等。         至于APR,就是Apache Portable Runtime的意思。是一套ANSI C编写的跨系统函数库,在常见的平台上实现了相同的C函数接口。尽管Apache项目对它依赖有限,但是作为屏蔽了系统细节,并提供高质量的平台封装这一点上还是相当可取的。就现在看来APR对DSO对象,也就是对应UNIX-like系统的SO文件,或者是Win32平台的DLL文件。就是对系统底层的各种操作细节做了很好的封装。尽管我们自己也可以不使用APR来完成SO对象或者DLL的调用,但是就调用方式的成熟方面显然很难超越APR。         现在开始分析APR代码的时间并不长,而且是Linux和Win32同时进行的,Linux的进度快一点,其实都是差不多的。我主要还是分析各类头文件的,对具体的C语言源文件的分析则并不着急。对头文件分析之后我一般会写一些实际调用的例子来测试一下,同时也是用于给出测试用例的。         到现在为止因为进度刚刚开始,所以还没有什么太大的成果。感觉代码方面倒是恰到好处,我自从学了Java之后每次代码都是注释连篇不成体统。而APR项目中,虽然使用C语言编写,但是却用到了类似javadoc的注释格式,这是一个相当不错的主意。另外头文件中的注释较为详细,而C语言源文件中则少有注释。对于函数的格式也是有些规律的,比如大多数到处函数都有这样的格式: APR_DECLARE(apr_status_t) func(aaa aaa,bbb bbb);         函数的直接返回值一般都是用于描述函数执行状态的,而参数中的第一个参数是用来返回实际的函数计算值的。其后的参数则各有用处。这样做的一个好处是每个函数都有完善的可查询状态,另外,当一个函数需要返回多个值的时候也相对方便。当然,用C的人都是实用主义者,所以并不是所有函数都遵循这个规律。比如DSO对象的导出函数中有一个函数用来获取错误码的就不是这种格式。         对于在Linux编译安装APR还是比较简单的。按照最easy的方式就可以安装成功,如果确实没有经验,可以按照如下方式: tar xzvf apr-1.2.2.tar.gz cd apr-1.2.2 ./configure make clean make make install         这样就安装成功了。安装处会提供静态库和动态库,另外还提供完善的头文件。         而在Windows系统下安装APR则麻烦一点。因为apr.h文件是需要configure出来的,而Windows并不含有这个工具。后来我实际安装了一下才发现,这个apr.h文件是从apr.hw文件复制过来的。而在使用APR函数库的时候根本就不需要#include这个文件,因为所有的其他头文件都已经自己包含过它了。         今天先写到这里。以后再发贴的时候就是具体的关于某个细节了,现在对DSO部分已经有了一定的了解,TIME部分还写过一点测试用例。以后我会继续把有关的说明帖上来。

参考