程式功能
APR(Apache portable Run-time libraries,Apache可移植運行庫)的目的如其名稱一樣,主要為上層的應用程式提供一個可以跨越多作業系統平台使用的底層支持接口庫。
在早期的Apache版本中,應用程式本身必須能夠處理各種具體作業系統平台的細節,並針對不同的平台調用不同的處理函式。隨著Apache的進一步開發,Apache組織決定將這些通用的函式獨立出來並發展成為一個新的項目。這樣,APR的開發就從Apache中獨立出來,Apache僅僅是使用APR而已。
目前APR主要還是由Apache使用,不過由於APR的較好的移植性,因此一些需要進行移植的C程式也開始使用APR,開源項目比如Flood loader tester(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中支持的基本類型
資料夾名稱描述
atomic/srclib/apr/atomic 原子操作
dso/srclib/apr/dso動態載入共享庫
fileio/srclib/apr/file_io 檔案IO處理
mmap/srclib/apr/mmap記憶體映射檔案
locks/srclib/apr/locks進程和執行緒互斥鎖
memory/srclib/apr/memory 記憶體池操作
network_io/srclib/apr/network_io 網路IO處理
poll/srclib/apr/poll輪詢IO
table/srclib/apr/tables Apache數組(堆疊)和表格以及哈希表
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 共享記憶體
random /srclib/apr/random 隨機數生成庫