Linux插件框架實(shí)驗(yàn)報(bào)告_第1頁(yè)
Linux插件框架實(shí)驗(yàn)報(bào)告_第2頁(yè)
Linux插件框架實(shí)驗(yàn)報(bào)告_第3頁(yè)
Linux插件框架實(shí)驗(yàn)報(bào)告_第4頁(yè)
Linux插件框架實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師:實(shí)驗(yàn)地點(diǎn):A2-412 一、實(shí)驗(yàn)室名稱(chēng):Linux環(huán)境高級(jí)編程實(shí)驗(yàn)室二、實(shí)驗(yàn)項(xiàng)目名稱(chēng):插件框架實(shí)驗(yàn)三、實(shí)驗(yàn)學(xué)時(shí):4學(xué)時(shí)四、實(shí)驗(yàn)?zāi)康模簩W(xué)習(xí)和實(shí)踐插件框架的開(kāi)發(fā)。理解插件的工作原理,為進(jìn)一步開(kāi)發(fā)高可用,高復(fù)雜度的插件打下基礎(chǔ)。五、實(shí)驗(yàn)內(nèi)容:1、使用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)打印功能:開(kāi)發(fā)一個(gè)程序,向屏幕打印“Hello World”;在不重新編譯鏈接原程序的前提下,將打印的文字改為“Hello China”。2、使用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)自定義打印功能:同時(shí)要打印“Hello World”,打印“Hello China”,甚至同時(shí)打印未來(lái)才會(huì)增加的其

2、他打印信息,打印信息的鏈接庫(kù)放在一個(gè)固定目錄中,遍歷這個(gè)目錄,獲取所有動(dòng)態(tài)鏈接庫(kù)。打印未來(lái)的這些信息,也不能重新編譯鏈接原程序。3、1)通過(guò)命令行方式:./a.out help,輸出所有插件實(shí)現(xiàn)的功能ID,以及該功能ID對(duì)應(yīng)的功能描述。2)通過(guò)命令行方式:./a.out FuncID,調(diào)用具體打印功能(每個(gè)插件導(dǎo)出GetID接口)。4、將插件導(dǎo)出的Print、GetID、Help三個(gè)函數(shù)放在一個(gè)類(lèi)中,主程序需要使用多個(gè)容器分別保存這些函數(shù)地址,讓插件外部獲取該類(lèi)的對(duì)象。綜合練習(xí):實(shí)現(xiàn)一個(gè)軟件系統(tǒng),該系統(tǒng)可對(duì)文件進(jìn)行統(tǒng)計(jì)分析。究竟對(duì)文件進(jìn)行什么樣的統(tǒng)計(jì)分析,最終用戶(hù)自己也不是很清楚,目前只知道需

3、要統(tǒng)計(jì)文件的行數(shù)。也就是說(shuō),本軟件系統(tǒng)將會(huì)隨時(shí)面臨,增加文件統(tǒng)計(jì)新功能的難題。請(qǐng)結(jié)合本實(shí)驗(yàn)內(nèi)容,設(shè)計(jì)并實(shí)現(xiàn)這樣一個(gè)面向文件統(tǒng)計(jì)功能的插件系統(tǒng)。(需要實(shí)現(xiàn)的插件包括:統(tǒng)計(jì)某個(gè)文件的行數(shù),統(tǒng)計(jì)某個(gè)文件的字節(jié)數(shù))六、實(shí)驗(yàn)步驟:程序1:A. h:extern "c" void f();a2.cpp:#include<iostream>#include"a.h"using namespace std;void f() cout << "hello,China!" << endl;A1.cpp:#include

4、<iostream>#include"a.h"using namespace std;void f() cout << "Hello,Word" << endl;Main.cpp:#include"a.h"#include<dlfcn.h>#include<iostream>using namespace std;int main() void *handle = dlopen("./libtest.so", RTLD_LAZY); if(0 = hand

5、le) cout << "dlopen error" << endl;return 0; typedef void (*Fun)(); Fun f1 = (Fun)dlsym(handle, "f"); if(0 = f1) cout << "f1 error" << endl; char *str = dlerror();cout << str << endl; (*f1)(); dlclose(handle); return 0;程序運(yùn)行結(jié)果如圖1所示:圖1:

6、字符的變換程序2:A1.cpp:#include<iostream>using namespace std;extern"C" void f()cout << "Hello world" << endl;A2.cpp:#include<iostream>using namespace std;extern "C" void f() cout << "Hello,china!" << endl;A3.cpp:#include<iostrea

7、m>using namespace std;extern "C" void f()cout << "Hello 333" << endl;A4.cpp:#include<iostream>using namespace std;extern "C" void f()cout << "Hello 4444" << endl;Test2.cpp:#include<dlfcn.h>#include<iostream>#include

8、<dirent.h>#include<stdio.h>#include<string.h>using namespace std;int main()char path260;DIR *dir;struct dirent *ptr; dir=opendir("/root/test/test4/plug2/plugin/");while(ptr=readdir(dir)!=NULL)if (strcmp(ptr->d_name,".")=0)|(strcmp(ptr->d_name,"."

9、)=0)continue;sprintf(path,"/root/test/test4/plug2/plugin/%s", ptr->d_name); void *handle = dlopen(path, RTLD_LAZY); if(0 = handle) cout << "dlopen error" << endl;return 0; typedef void (*Fun)(); Fun pf = (Fun)dlsym(handle, "f"); if(0 = pf) cout << &

10、quot;pf error" << endl; char *str = dlerror();cout << str << endl;return 0; (*pf)();dlclose(handle); closedir(dir);程序運(yùn)行結(jié)果如圖2所示:圖2:插件的遍歷程序3:a1.cpp:#include <iostream>using namespace std;const int FUNC_ID = 1;extern "C" void f() cout << "Hello World!&q

11、uot; << endl;extern "C" void Help() cout << "Function ID " << FUNC_ID << " : This function prints Hello World." << endl;a2.cpp:#include <iostream>using namespace std;const int FUNC_ID = 2;extern "C" void f() cout << &q

12、uot;Hello China!" << endl;extern "C" void Help() cout << "Function ID " << FUNC_ID << " This function prints hello china." << endl;CPluginEnumerator.cpp#include "CPluginEnumerator.h"#include <dirent.h>#include <strin

13、g.h>#include <iostream>#include <stdio.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& vstrPluginNames) DIR *dir = opendir("/root/test/test4/plug3/plugin"); if(dir = 0)return false; f

14、or(;) struct dirent *ptr = readdir(dir);if(ptr = 0)break;if(strcmp(ptr->d_name, ".") = 0)|(strcmp(ptr->d_name, ".") = 0)continue;char path260;sprintf(path, "/root/test/test4/plug3/plugin/%s", ptr->d_name);vstrPluginNames.push_back(path); closedir(dir);return tr

15、ue;Test.cpp:#include <dlfcn.h>#include <iostream>#include "CPluginEnumerator.h"#include <string.h>#include <stdio.h>using namespace std;int main(int argc, char *argv)char path 260; if(argc != 2)return 0; if(strcmp(argv1, "help") = 0) vector<string> v

16、strPluginNames; CPluginEnumerator enumerator; if(!enumerator.GetPluginNames(vstrPluginNames) cout << "GetPluginNames error" << endl;return 0; for(int i = 0; i< vstrPluginNames.size(); i+) void *handle = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY);if(handle = 0)cout <<

17、"dlopen error" << endl; return 0;typedef void (*FUNC_HELP)();FUNC_HELP dl_help = (FUNC_HELP)dlsym(handle, "Help");if(dl_help = 0)cout << "dlsym error" << endl; return 0;(dl_help)();dlclose(handle);else if(strcmp(argv1, "1") = 0)sprintf(path,

18、"/root/test/test4/plug3/plugin/%s", "a1.so");void *handle = dlopen(path, RTLD_LAZY);if(handle = 0)cout << "dlopen error" << endl;return 0;typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, "f");if(dl_print = 0)cout <<

19、; "dlsym error" << endl;return 0;(dl_print)();dlclose(handle);else if(strcmp(argv1, "2") = 0)/ 得到第二個(gè)func的參數(shù)sprintf(path, "/root/test/test4/plug3/plugin/%s", "a2.so");void *handle = dlopen(path, RTLD_LAZY);if(handle = 0)cout << "dlopen error&qu

20、ot; << endl;return 0;typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, "f");if(dl_print = 0)cout << "dlsym error" << endl;return 0;(dl_print)();dlclose(handle);return 0;程序運(yùn)行結(jié)果如圖3所示:圖3:插件輸出程序4:CPluginEnumerator.h:#ifndef CPLUGINENUMERAT

21、OR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector<string>& vstrPluginNames);#endifCPluginEnumerator.cpp:#include "CPluginEnumerato

22、r.h"#include <dirent.h>#include <string.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& vstrPluginNames) DIR *dir = opendir("./plugin"); if(dir = 0)return false; for(;) struct diren

23、t *pentry = readdir(dir);if(pentry = 0) break;if(strcmp(pentry->d_name, ".") = 0) continue;if(strcmp(pentry->d_name, ".") = 0) continue;string str = "./plugin/"str += pentry->d_name;vstrPluginNames.push_back(str); closedir(dir); return true;CPluginController.h#

24、ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include <vector>class IPrintPlugin;class CPluginControllerpublic:CPluginController(void);virtual CPluginController(void);bool InitializeController(void);bool UninitializeController(void);bool ProcessHelp(void);bool ProcessRequest(int Functi

25、onID);private:std:vector<void *> m_vhForPlugin;std:vector<IPrintPlugin*> m_vpPlugin;#endifCPluginController.cpp#include "CPluginController.h"#include "CPluginEnumerator.h"#include "IPrintPlugin.h"#include "dlfcn.h"CPluginController:CPluginControlle

26、r(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*P

27、LUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) m_vhForPlugin.push_back(hinstLib);CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL != CreateProc) (CreateP

28、roc)(&pPlugin);if(pPlugin != NULL)m_vpPlugin.push_back(pPlugin);return true;bool CPluginController:ProcessRequest(int FunctionID)for(unsigned int i = 0; i < m_vpPlugin.size(); i+)if(m_vpPlugini->GetID() = FunctionID)m_vpPlugini->Print();break;return true;bool CPluginController:ProcessHe

29、lp(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void*

30、 hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)pPlugin->Help();dlclose(hinstLib);return true;bool CPluginController:UninitializeC

31、ontroller()for(unsigned int i = 0; i < m_vhForPlugin.size(); i+)dlclose(m_vhForPlugini);return true;IPrintPlugin.h#pragma onceclass IPrintPluginpublic:IPrintPlugin();virtual IPrintPlugin();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;IPrintPlugin.cpp#include "IPri

32、ntPlugin.h"IPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()Function.cpp#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC_ID = 1;class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout <<

33、 "Hello World!" << endl;virtual void Help()cout << "Function ID " << FUNC_ID << " : This function will print hello world." << endl;virtual int GetID(void)return FUNC_ID;extern "C" void CreateObj(IPrintPlugin *ppPlugin)static CPrin

34、tPlugin plugin;*ppPlugin = &plugin;function1.cpp#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC_ID = 2;class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout << "Hello China!" <

35、< endl;virtual void Help()cout << "Function ID " << FUNC_ID << " : This function will print hello china." << endl;virtual int GetID(void)return FUNC_ID;extern "C" void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &am

36、p;plugin;Main.cpp#include <iostream>#include "CPluginController.h"#include <string.h>#include <stdlib.h>using namespace std;int main(int argc, char *argv)if(argc != 2)cout << "Parameters error" << endl;return 0;if(strcmp(argv1, "help") = 0)

37、CPluginController pc;pc.ProcessHelp();return 0;int FunctionID = atoi(argv1);CPluginController pc;pc.InitializeController();pc.ProcessRequest(FunctionID);pc.UninitializeController();return 0;程序運(yùn)行結(jié)果如圖4所示:圖4:插件獲取類(lèi)對(duì)象綜合練習(xí):CPluginController.cpp#include "CPluginController.h"#include "CPlugin

38、Enumerator.h"#include "IPrintPlugin.h"#include "dlfcn.h"#include <string.h>CPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator

39、enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib !=

40、 NULL) m_vhForPlugin.push_back(hinstLib);CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)m_vpPlugin.push_back(pPlugin);return true;bool CPluginController:ProcessRequest(int FunctionID)for(unsigned int i = 0; i &

41、lt; m_vpPlugin.size(); i+)if(m_vpPlugini->GetID() = FunctionID)m_vpPlugini->Print();break;return true;bool CPluginController:ProcessHelp(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=

42、0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL != Cre

43、ateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)pPlugin->Help();dlclose(hinstLib);return true;bool CPluginController:IfProcess(char *Function)/判斷插件是否存在unsigned int i;for(i = 0; i < m_vpPlugin.size(); i+)if(strcmp(Function, m_vpPlugini->GetName() = 0)break;if(i < m_vpPlugin.size()/

44、插件存在return true;elsereturn false;bool CPluginController:ProcessFunction(char *Function,char*Document)/執(zhí)行插件功能for(unsigned int i = 0; i < m_vpPlugin.size(); i+)if(strcmp(Function, m_vpPlugini->GetName() = 0)m_vpPlugini->Fun(Document);/插件功能break;return true;bool CPluginController:UninitializeC

45、ontroller()for(unsigned int i = 0; i < m_vhForPlugin.size(); i+)dlclose(m_vhForPlugini);return true;CPluginController.h#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include <vector>class IPrintPlugin;class CPluginControllerpublic:CPluginController(void);virtual CPluginController(vo

46、id);bool InitializeController(void);bool UninitializeController(void);bool ProcessHelp(void);bool ProcessRequest(int FunctionID);bool IfProcess(char *Function);bool ProcessFunction(char *Function,char *Document);private:std:vector<void *> m_vhForPlugin;std:vector<IPrintPlugin*> m_vpPlugi

47、n;#endifCPluginEnumerator.h#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector<string>& vstrPluginNames);#endifCPl

48、uginEnumerator.cpp#include "CPluginEnumerator.h"#include <dirent.h>#include <string.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& vstrPluginNames) DIR *dir = opendir("./plugin&quo

49、t;); if(dir = 0)return false; for(;) struct dirent *pentry = readdir(dir);if(pentry = 0) break;if(strcmp(pentry->d_name, ".") = 0) continue;if(strcmp(pentry->d_name, ".") = 0) continue;string str = "./plugin/"str += pentry->d_name;vstrPluginNames.push_back(str)

50、; closedir(dir); return true;Main.cpp#include <iostream>#include "CPluginController.h"#include <string.h>#include <stdlib.h>using namespace std;int main(int argc, char *argv)if(argc = 2)if(strcmp(argv1, "help") = 0)/幫助功能CPluginController pc;pc.ProcessHelp();retu

51、rn 0;elseint FunctionID = atoi(argv1); CPluginController pc; pc.InitializeController(); pc.ProcessRequest(FunctionID); pc.UninitializeController();return 0;else if(argc = 3)CPluginController pc;char *Function = argv1;/Function+=".so"char *Document = argv2;/操作的文件名pc.InitializeController();i

52、f(pc.IfProcess(Function)=false)/判斷插件是否存在cout << "No this plugin!" << endl;else/ pc.ProcessFunction(Function,Document);pc.UninitializeController();return 0;elsecout << "Parameters error" << endl;return 0;插件:IPrintPlugin.cpp#include "IPrintPlugin.h"

53、;IPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()IPrintPlugin.h#pragma onceclass IPrintPluginpublic:IPrintPlugin();virtual IPrintPlugin();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;virtual char * GetName() = 0;/添加部分virtual void Fun(char*) = 0;Line.cpp#include <

54、iostream>#include "IPrintPlugin.h"#include <unistd.h>/read(file)#include <fcntl.h>#include <string.h>using namespace std;const int FUNC_ID = 3;char FUNC_NAME="sl"/statistics line!class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout << "Statistics the document line!" << endl;virtual void Help()cout << "Function ID " << FUNC_ID << " : This function will statistics the document line.&q

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論