c語言下的工廠模式 ipmi原始碼分析

2021-03-31 20:55:34 字數 1808 閱讀 1187

背景簡介

*****===

ipmi(intelligent platform management inte***ce)是一套用於硬體平台管理的規範/介面。

而ipmitool是用於管理和配置支援ipmi規範硬體的工具。

ipmitool的架構

**********====

原始碼目錄如下

+---contrib         //用於建立web管理頁面的shell指令碼

+---control         //包含一些安裝、配置資訊

+---debian          //包含changelog等資訊

+---doc             //man的幫助資訊

+---include

|   /---ipmitool    //標頭檔案定義

+---lib             //對ipmi規範的對應實現,如ipmi_session.c處理session

/---src             //此目錄下是ipmitool的三個主程式

/---plugins     // ipmi_intf.c inte***ce一些通用功能的實現

+---bmc     // ipmitool與bmc kernel driver之間的介面

+---imb     // intel imb inte***ce

+---lan     // ipmi v1.5 lan inte***ce

+---lanplus // ipmi v2.0 rmcp+ lan inte***ce

+---lipmi   // solaris x86 lipmi inte***ce

/---open    // linux openipmi inte***ce [default]

c語言下的工廠模式

***************==

從上述的目錄結構不難看出,ipmitool設計上的乙個重要特色就是將不同的inte***ce看作plugin。從而使系統具有清晰的結構和良好的擴充性。

ipmi規範中定義的實體,如session,fru,sdr,chassis,sensor等等,都在lib中做對應的實現。這部分是與具體inte***ce相分離的。inte***ce的通用介面在include/ipmitool/ipmi_intf.h中定義;inte***ce的通用功能實現,在/src/plugins/ipmi_intf.c中。值得注意的是,inte***ce是ipmi規範中定義的概念,普通意義上的介面本文中均使用中文「介面」。

這種將通用介面與具體實現相分離的方式無疑就是一種簡單工廠模式了。

實踐====

那麼inte***ce具體是怎麼實現為plugin的呢?可以從乙個具體的例子看一下。

include/ipmitool/ipmi_intf.h中用ipmi_intf定義了了

struct ipmi_intf ;

與oo語言類似,struct內部定義了資料和方法。不同的是,方法採用的是函式指標的方式。因為沒有this指標,所以函式的形參就是指向自身struct的指標。如setup。

而在具體實現中,如src/plugins/lan/lan.c中給出了具體的函式實現。如ipmi_lan_setup。在ipmi_lan_setup中,即可使用形參定義的intf指標實現對ipmi_intf結構中相應資料的操作。

struct ipmi_intf ipmi_lan_intf = ;

會者不難,難者不會,嘿嘿

C語言下的位運算

簡介 程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算是直接對整數的二進位制位進行操作,簡便高效。下表列出了c語言的位運算子 名稱運算子 含義按位與 a b 僅1 1 1 按位或a b 僅0 0 0 按位異或 a b 對應數字上的數相同為0,不同為1 按位取反 a0和1全部取反 注意...

c語言下的檔案操作函式

這段時間整理c語言的檔案操作函式費了老大勁,太久沒接觸c語言,一開始寫起來很不順心,終於算是整理了一部分函式出來,可以告一段落了.但是還有一點bug,在對檔案進行寫入操作時,對於寫入資料的長度如果大於寫入字串本身長度的話,這時候該檔案的內容會多出一些莫名其妙的資料,希望遇到過此類問題的朋友告訴我原因...

C語言下的核心鍊錶

二.核心鍊錶 核心鍊錶是一種鍊錶,linux核心中的鍊錶都是用這種形式實現的 1.特性 核心鍊錶是一種雙向迴圈鍊錶,核心鍊錶的節點節點結構中只有指標域 使用核心鍊錶的時候,將核心鍊錶作為乙個成員放入到乙個結構體中使用 我們在鍊錶中找到核心鍊錶結構的位址,通過這個位址就可以找到外部大結構體的位址,通過...