APR(Apache portable Run-time libraries,Apache可移植運行庫)的目的如其名稱一樣,主要為上層的應(yīng)用程序提供一個可以跨越多操作系統(tǒng)平臺使用的底層支持接口庫。
在早期的Apache版本中,應(yīng)用程序本身必須能夠處理各種具體操作系統(tǒng)平臺的細節(jié),并針對不同的平臺調(diào)用不同的處理函數(shù)。隨著Apache的進一步開發(fā),Apache組織決定將這些通用的函數(shù)獨立出來并發(fā)展成為一個新的項目。這樣,APR的開發(fā)就從Apache中獨立出來,Apache僅僅是使用APR而已。
目前APR主要還是由Apache使用,不過由于APR的較好的移植性,因此一些需要進行移植的C程序也開始使用APR,開源項目比如Flood loader tester(http://httpd.apache.org/test/flood/,該項目用于服務(wù)器壓力測試,不僅僅適用于Apache)、FreeSwitch(www.freeswitch.org),JXTA-C(http://jxta-c.jxta.org,C版本的JXTA點對點平臺實現(xiàn));商業(yè)的項目則包括Blogline(http://www.bloglines.com/,covalent(http://www.covalent.net)等等。 APR使得平臺細節(jié)的處理進行下移。對于應(yīng)用程序而言,它們根本就不需要考慮具體的平臺,不管是Unix、Linux還是Window,應(yīng)用程序執(zhí)行的接口基本都是統(tǒng)一一致的。因此對于APR而言,可移植性和統(tǒng)一的上層接口是其考慮的一個重點。而APR最早的目的并不是如此,它最早只是希望將Apache中用到的所有代碼合并為一個通用的代碼庫,然而這不是一個正確的策略,因此后來APR改變了其目標(biāo)。有的時候使用公共代碼并不是一件好事,比如如何將一個請求映射到線程或者進程是平臺相關(guān)的,因此僅僅一個公共的代碼庫并不能完成這種區(qū)分。
APR的目標(biāo)則是希望安全合并所有的能夠合并的代碼而不需要犧牲性能。 APR的最早的一個目標(biāo)就是為所有的平臺(不是部分)提供一個公共的統(tǒng)一操作函數(shù)接口,這是一個非常了不起的目的,當(dāng)然也是不現(xiàn)實的一個目標(biāo)。我們不可能支持所有平臺的所有特征,因此APR目前只能為大多數(shù)平臺提供所有的APR特性支持,包括Win32、OS/2、BeOS、Darwin、Linux等等。為了能夠?qū)崿F(xiàn)這個目標(biāo),APR開發(fā)者必須為那些不能運行于所有平臺的特性創(chuàng)建了一系列的特征宏(FEATURE MACROS)以在各個平臺之間區(qū)分這些特征。這些特征宏定義非常簡單,通常如下: APR_HAS_FEATURE 如果某個平臺具有這個特性,則該宏必須設(shè)置為true,比如Linux和window都具有內(nèi)存映射文件,同時APR提供了內(nèi)存映射文件的操作接口,因此在這兩個平臺上,APR_HAS_MMAP宏必須設(shè)置,同時ap_mmap_*函數(shù)應(yīng)該將磁盤文件映射為內(nèi)存并返回適當(dāng)?shù)臓顟B(tài)碼。如果你的操作系統(tǒng)并不支持內(nèi)存映射,那么APR_HAS_MMAP必須設(shè)置為0,而且所有的ap_mmap_*函數(shù)也可以不需要定義。第二步就是對于那些在程序中使用了不支持的函數(shù)必須提出警告。
APR中支持的基本類型
文件夾名稱 描述
atomic/srclib/apr/atomic 原子操作
dso/srclib/apr/dso 動態(tài)加載共享庫
fileio/srclib/apr/file_io 文件IO處理
mmap/srclib/apr/mmap 內(nèi)存映射文件
locks/srclib/apr/locks 進程和線程互斥鎖
memory/srclib/apr/memory 內(nèi)存池操作
network_io/srclib/apr/network_io 網(wǎng)絡(luò)IO處理
poll/srclib/apr/poll 輪詢IO
table/srclib/apr/tables Apache數(shù)組(堆棧)和表格以及哈希表
process /srclib/apr/threadproc 進程和線程操作
user /srclib/apr/user 用戶和用戶組操作
time /srclib/apr/time 時間操作
string/srclib/apr/strings 字符串操作
password /srclib/apr/passwd 終端密碼處理
misc /srclib/apr/misc 大雜燴,不屬于其余類的任何apr類型都可以放在里面
shmem /srclib/apr/shmem 共享內(nèi)存
random /srclib/apr/random 隨機數(shù)生成庫