APR(Apache portable Run-time libraries,Apache可移植運行庫)的目的如其名稱一樣,主要為上層的應用程序提供一個可以跨越多操作系統平台使用的底層支持接口庫。在早期 的Apache版本中,應用程序本身必須能夠處理各種具體操作系統平台的細節,並針對不同的平台調用不同的處理函數。
隨着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)等等。
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中支持的基本類型
類型名稱 |
文件夾名稱 |
描述 |
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 |
隨機數生成庫 |
apr中包含了一些通用的開發組件,包括mmap,DSO等等
apr-util該目錄中也是包含了一些常用的開發組件。這些組件與apr目錄下的相比,它們與apache的關系更加密切一些。比如存儲段和存儲段組,加密等等。
apr-iconv包中的文件主要用於實現iconv編碼。目前的大部分編碼轉換過程都是與本地編碼相關的。在進行轉換之前必須能夠正確地設置本地編碼。因此假如兩個非本地編碼A和B需要轉換,則轉換過程大致為A->Local以及Local->B或者B->Local以及Local->A。
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