acl介紹

1、acl 是什麼?mysql

 

  實際上是一個很簡單的問題,acl 的英文字母 advanced C library 的縮寫(固然,您也能夠認爲是 a C library 的縮寫)。也許有人會問:"如今有這麼多C的函數庫,爲什麼還費這麼大勁再寫一個?"。的確,如今開源的 C 函數庫真是太多了,好比:glib(這是一個gnome工做組開發維護的庫,開始也是爲了gnome界面用,後來發展成通用的 C 函數庫),libevent(這是UNIX平臺下一個封裝了 select/poll/epoll/kquue 等的庫,主要是爲了應對大併發網絡程序的開發),pthread-win32(這是在win32平臺下按Posix接口標準寫的庫,其中google的 chrome 瀏覽器就用到了它),固然還有更爲著名的 C++ 函數庫 ACE(還有自稱比ACE還好的C++庫ICE)。每一個庫都有各自的特色,都能知足不一樣的應用需求。可是,當我在開發一個但願能跨平臺的、支持常見數據算 法、有很好的服務器框架、支持線程池/進程池、支持同步/異步通訊、簡單易用可擴展、支持HTTP協議、ICMP協議、DNS協議等的應用時,就不得不組 合各個函數庫,有時還得爲這些庫的不兼容性作些努力。linux

 

2、acl 是怎麼來的?ios

 

  所以寫一個通用簡單的 C 庫就成爲了一個小小的目標,開始 acl 的名字叫 util,生成的庫名叫 lib_util.a,而且該庫的函數大部是從 Postfix 借鑑過來的,也就是說初期沒有 Postfix 就不會有 acl。Postifx 雖然只是一個郵件的 mta(如今國內的不少大的網站的MTA就是由 Postfix 修改而成,象 sohu, 263, sina, qq 等的郵件系統),但其中的函數庫卻設計的如此巧奪天工, 雖然是用 C 語言寫成,但其設計思想卻可與 C++ 媲美,Wietse Venema   不愧爲世界級架構師,不然IBM也就不會請他來寫 Postfix 了,在讀了 Postfix 的源碼後,本人將其中一些具備通用性的函數庫(象vstring.c, htable.c, ring.c, etc)抽出來,構成了 lib_util.a 的主體部分。隨着時間的演變, lib_util 里加的函數庫愈來愈多,而且在與其它函數庫連用時很容易形成命名衝突,由於 C 語言沒有象 C++ 命名空間的概念,通常的作法都是在函數名前加 xxx 先後綴來區分。因此,是應該從新給 lib_util 起個名字的時候了,象 tcl(turbo c library), 等名字都被用過,但總以爲有點彆扭,有一天忽然想到用 acl 彷佛也不錯,嗯,advanced C library ---高級 C 庫,意思是應該比 ANSI C 的標準庫提供更爲高級的功能。acl 名稱肯定下來後,因而把函數的名稱都加了小寫的 acl_ 前綴,結構、宏、全局定義的名稱前都加了 ACL_ 前綴,確實是個不錯的命名。nginx

 

3、acl 的目錄劃分git

 

  開始時 acl 的目錄規劃比較簡單,只有 src/ 和 include/ 兩個目錄,全部的源代碼及頭文件都分別放在這兩個目錄下,固然這也主要是由於 Postifx 的 util/ 目錄下是通用的函數庫的緣由(當初就是想把 Postfix 的 util/ 下的庫單獨抽出來),當發現函數庫愈來愈多時,發現將全部源代碼放在同一目錄下維護起來是多麼地麻煩,因此想應該規劃一下目錄結構了,因而乎,劃分了幾個 一級目錄:stdlib/, event/, aio/, thread/ 等目錄,其中在 stdlib/ 目錄下還有 common/, memroy/, string/, configure/ 等二級目錄。這樣,acl 的體系結構算是基本造成了。如今 acl 的目錄劃分基本是以功能爲標準的,各個目錄的主要功能以下:程序員

 

3.1 src 目錄github

 

3.1.1 init/ : 主要用於初始化 acl 基礎庫web

 

3.1.2 stdlib/ : 是一些比較基礎的功能函數庫,在 stdlib/ 根目錄下主要包括一些有關日誌記錄、網絡/文件流處理、VSTRING緩衝操做等功能函數;在 stdlib/ 下還有二級目錄,以下:算法

3.1.2.1 common/ : 該目錄主要爲一些經常使用的數據結構及算法的功能函數庫,象哈希表、鏈表、隊列、動態數組、堆棧、緩存、平衡二叉樹、模式匹配樹等;sql

3.1.2.2 memory/ : 該目錄主要包含與內存操做相關的函數庫,象內存基礎分配與校驗、內存池管理、內存切片管理等;

3.1.2.3 filedir/ : 該目錄主要包含與目錄遍歷、目錄建立等相關的庫;

3.1.2.4 configure/ : 該目錄主要包含配置文件的分析庫;

3.1.2.5 iostuff/ : 該目錄主要包含一些經常使用的IO操做的函數庫,象讀/寫超時、設置IO句柄的阻塞模式等;

3.1.2.6 string/ : 該目錄主要包含一些經常使用的字符串操做的庫,提供了比標準C更靈活高效的字符串操做功能;

3.1.2.7 debug/ : 主要用於協助調試內存的泄露等功能;

3.1.2.8 sys/ : 主要是與不一樣操做系統平臺相關的API的封裝函數庫;

 

3.1.3 net/: 是與網絡操做相關的函數庫,包含網絡監聽、網絡鏈接、DNS查詢、套接口參數設置等功能;

3.1.3.1 connect/ : 主要是與網絡鏈接相關的函數庫,包含網絡鏈接、域套接口鏈接等;

3.1.3.2 listen/ : 主要是與網絡監聽相關的函數庫,包含網絡監聽、域套接口監聽等;

3.1.3.3 dns/ : 主要是與DNS域名查詢相關的函數庫,包含對 gethostbyname 等接口的封裝、按RFC1035標準直接發送UDP包方式進行查詢等功能;

 

3.1.4 event/ : 主要封裝了 select/poll/epoll/kqueue/devpoll 等系統API接口,使處理網絡事件更加靈活、高效、簡單,另外還包含定時器接口,acl 中的不少網絡應用都會用到這些接口,象 aio、master 等模塊;

 

3.1.5 aio/ : 主要包含網絡異步操做的功能函數,該套函數庫在處理高併發時有很是高的效率,並且提供了比基礎API更爲高級的調用方式,比使用象 libevent 之類的函數庫更爲簡單,並且是線程安全的;

 

3.1.6 msg/ : 主要包含了基於線程的消息事件及基於網絡的消息事件功能;

 

3.1.7 thread/ : 主要是封裝了各個OS平臺下的基礎線程API,使對外接口保持一致性,消除了平臺的差別性,同時還提供了半駐留線程池的函數庫,以及對於線程局部變量的擴展;

 

3.1.8 db/ : 主要是一些與數據庫有關的功能庫,定義了一個通用的數據庫鏈接池的框架(而且實現了mysql的鏈接池實例);一個簡單的內存數據庫(由哈希表、鏈表、平衡二叉樹組合而成);ZDB數據存儲引擎,這是一個高效的基於數字鍵的存儲引擎;

 

3.1.9 proctl/ : win32 平臺下父子進程控制功能庫;

 

3.1.10 code/ : 常見編碼函數庫,包括 base64編解碼、URL編解碼以及一些漢字字符集編碼等;

 

3.1.11 unit_test/ : 包含有關進行 C 語言單元測試的功能庫;

 

3.1.12 xml/:是一個流式的 xml 解析器及構造器,能夠支持阻塞及阻塞式網絡通訊;

 

3.1.13 json/:是一個流式的 json 解析器及構造器,能夠支持阻塞及阻塞式網絡通訊;

 

3.1.14 master/: 是在 UNIX 環境下支持多種服務器模式的服務器框架,目前主要支持多進程模式、多進程多線程模式、多進程非阻塞模式以及多進程觸發器模式;

 

4、acl 是如何跨平臺的?是如何支持WIN32平臺的?

 

  在開發 acl 庫時是徹底基於 linux 平臺的,後來公司要作一個P2P的項目,須要在WIN32下開發客戶端程序,主要須要 acl 中的 HTTP 協議通訊及協議解析部分,因此爲了項目須要, acl 中的HTTP協議庫及HTTP協議庫所依賴的一些函數庫被移植至WIN32下。由此,以爲 acl 應該有一個 win32 版本,因此本人花費數週N個晚上,將 acl 庫中的幾乎全部函數庫都移植至WIN32下(固然目前僅有master服務器框架還沒移植),後來還移植至FreeBSD、Solaris(x86)上 (從LINUX移植至這些UNIX平臺相對容易些),主要仍是在移植至WIN32平臺時比較費勁,由於WIN32的API與UNIX及POSIX的真是相 差太遠了,感受一點就是在WIN32下直接用API編程仍是挺辛苦的,有時原本一個很是簡單的IO讀寫,在WIN32下卻須要N個參數,而且微軟的API 還有一個特色,就是不少API都有一個Ex(擴展)版,看來是它們的工程師在當初設計API時發現不夠用又加進去的。

  另外,微軟的編譯器版本比較多,有VC6,VC2002,VC2003,VC2005,VC2008,如今還有VC2010,各個編譯器之間還 有一些差異,要想徹底支持這些編譯器工做量是巨大的,因此acl 目前能夠用 VC6, VC2003, VC2008 編譯,提及僅支持這些編譯器仍是有緣由的,VC6作爲一個老牌的編譯器,存在的歷史時期比較久,自 Borland 的BC被VC戰勝後,微軟就在VC編譯器無所做爲了,N年未大改過VC6,說實在話,這個VC6也真是夠難用的(固然如今還有許多人在用它),後來微軟終 於出VC2002,算是VC6的一個大版本升級,終於變得「比較」好用了,不過VC2002彷佛存在很多BUGS,因此微軟又推出了VC2003,這個版 本本人以爲仍是很不錯的,能夠說是VC6的終極版,由於VC2005後,微軟在VC編譯器的改動就比較大了,顯著一點就是比較浪費系統資源了,對於象我這 樣用慣 vi 編輯程序的程序員,機器配置並不須要過高,而用VC2005時明顯機器的CPU及內存不夠用的,本人感受 VC6, VC2002,VC2003 屬於一個系列的,標準C庫變更不是特別大,但到了VC2005後就變更比較多了,好比在VC2003時通常用 snprintf 就能夠了,但用VC2008時,你會發現微軟「自做聰明」地提示你應該用 snprintf_s ,並且多了幾個參數,爲了支持VC2008,acl庫裏仍是作了很多改動。但本人仍是比較偏心VC2003,它僅不會象VC2005/VC2008那樣費 資源,又比VC6好用,並且沒有VC2002那麼多BUGS,因此 acl 庫在WIN32的主推編譯器是VC2003:)。

 

5、acl 從哪些開源軟件中汲取了經驗?

  首先得感謝 Postfix(2002-2005本人在方標以此做爲方標郵件系統的MTA模塊), 裏面良好的框架設計及編碼風格是 acl 始終追求的;squid(2005-2007年本人在和訊改造SQUID以適應和訊的網絡訪問需求)/nginx,這兩款HTTP代理加速軟件在HTTP協議處理方面給本人了不少啓示;ircd 是一個比較「古老」的聊天服務器(2000-2002年本人在263作的263  web聊天室的後臺服務器就是基於 ircd),也是本人最先接觸的服務器程序,並且同 squid/nginx 同樣是非阻塞通信模式。

 

我的微博:http://weibo.com/zsxxsz

acl 下載

acl 的編譯與使用

github:https://github.com/zhengshuxin/acl

bbs:http://www.aclfans.com

更多文章

QQ 羣:242722074

相關文章
相關標籤/搜索