Linu插件框架实验报告_第1页
Linu插件框架实验报告_第2页
Linu插件框架实验报告_第3页
Linu插件框架实验报告_第4页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linu插件框架实验报告 电 电 子 科 技 大 学 实 实 验 报 告 学生姓名: 学 号: 指导教师: 实验地点: 2-412 实验时间:2021 、01 、0 一、实验室名称: linux 环境高级编程实验室 二、实验项目名称: 插件框架实验 三、实验学时: 4 学时 四、实验目得: 学习与实践插件框架得开发。理解插件得工作原理,为进一步开发高可用,高复杂度得插件打下基础。 五、实验内容: 、使用动态链接库实现打印功能: 开发一个程序,向屏幕打印"hllo worl'在不重新编译链接原程序得前提下,将打印得文字改为"hello china'。 2、使用

2、动态链接库实现自定义打印功能: 同时要打印"helo wor',打印"heo hina',甚至同时打印未来才会增加得其她打印信息,打印信息得链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。 打印未来得这些信息,也不能重新编译链接原程序。 3、 1)通过命令行方式:、a、ut e,输出所有插件实现得功能id,以及该功能d 对应得功能描述。 2)通过命令行方式:、/a、out cd,调用具体打印功能(每个插件导出eid 接口)。 4、将插件导出得int、gtd、hl三个函数放在一个类中,主程序需要使用多个容器分别保存这些函数地址,让插件外部获取该类得

3、对象。 综合练习:实现一个软件系统,该系统可对文件进行统计分析。究竟对文件进行什么样得统计分析,最终用户自己也不就是很清楚,目前只知道需要统计文件得行数。也就就是说,本软件系统将会随时面临,增加文件统计新功能得难题。请结合本实验内容,设计并实现这样一个面向文件统计功能得插件系统。(需要实现得插件包括:统计某个文件得行数,统计某个文件得字节数) 六、实验步骤: 程序 1: a.h: eten c vi f(); a2、cpp: #inclueiosteam #nclude、h using amespac t; void f() cou ell,hina! nd; a、cp: #cldiostre

4、a cla、 uing nampae s; vo f() cout helo,word e; min、cp: #includa、h #inclddcn、h #inleiostream using namspac td; int main() void *hnd dlope(、/lib、o, tld_lazy); if( = nle) ;ln rore neld tuoc return 0; tyedef vo (*fun)(); fn f1 (fun)lsm(handle, f); if(0 = f1) ;ldn oe 1f tuo hr *str dlerror(); ou str ndl;

5、 (f1)(); dclose(hande); return 0; 程序运行结果如图所示: 图 1:字符得变换 程序: a、cpp: #includeitam using namespace st; eterc void () ;e dlo lleh tuoc a2、pp: #inclueiostream usn namespace std; xtern o f() cout helo,cina! endl; a3、cpp: #incldeostram using naespa std; etern c void f() ;le 33 eh tuoc a4、pp: #inlueiostea u

6、sin amespace std; extrn c od f() ;ne 444 olleh toc tt2、cpp: #inluddlfcn、h #iludeiostrea #incuedirn、h #nluesdio、h #indestrn、h using namespa sd; int mi() ;2hap rhc ;rid* ;rp* teri tcts ;)/gulp/2lp/4set/tset/toor/(rdep=i )lun=!))id(ridae=rtp((elihw i (rcmp(tr-d_nme,、)0)|(strp(ptrd_ae,、)=0) ;enitnc sprt

7、(path,/rottest/est4/pug2/plugin%s, pr-dame); ;)za_dltr ,ht(epld elda* dio if(0 = hndle) ;lne rre npold u rern 0; ;)()nf*( diov feep un pf = (fun)dlsym(hanl, ); )p = 0(fi cot pf error el; ca *sr = dlerro(); ;dn s tuoc rturn 0; (*f)(); ;)ldah(esolcl ;)i(ridsolc 程序运行结果如图 2 所示: 图 2:插件得遍历 程序: a1、pp: #inc

8、lud iost usi namspce sd; const int fnc_id = ; exrn c oi f() cout helo wrld! n; etern void hlp() cout fnctio i fud : tis functn prn lo wod、 endl; 、cp: #inclue iotem using namespc std; onst t func_id = 2; extern c oid f() ut llo cna! ndl; extern oid lp() cout fuction d fu_d th ntion pris helo china、 d

9、l; cpgnenumetor、cpp #iclde plugneumeato、h #lude dirent、h #includ rin、h ncude iostram #inude stdio、h cplugiemeato:cpluginueraor() clginenmerto:cplgienumetor() bool cplgnenurtor:tpluginnames(vetrsng vstrpluginnes) dir *di = openi(/t/tst/tst4/pugln); if(dir = 0) ;sla nruter fo(;) struct drt *ptr = read

10、dir(dir); )0 = rtp(fi brea; if((strcmp(ptr-dname, 、) = 0)|(stcmp(pt-d_nm, 、) = 0) contiu; ;062hp rhc ;)emand-rt ,s%/niulp/3gulp/4tset/tst/tor/ ,htap(ftnirp trpluinnames、ps_ack(pt); closeir(dr); ;urt nt test、pp: #ilue dlfcn、h iclude iotam #icd cplugnenumertor、h #includ string、h #lude stdio、h using ae

11、sce sd; i main(t arg, char *argv) ;02 htap rhc if(ag != ) ;0 utr f(stmp(arv, help) = ) vectorsrng rplugnames; cpluginueator emertor; i(!enmeatr、getpluginams(srpluginnes) ;ln rore mnnigupte tuoc return 0; )+ ;)(is、semannigulptsv i ;0 = i tni(ro dltr ,)(t_、semanniglprtsv(nepod = eldnah divaz); ) = lnh

12、(i out lope errr edl; tun 0; ;)()pleh_nf*( diov feepyt func_hlp dl_elp = (func_elp)dlsym(hanle, help); if(dl_hel = 0) ;ldne rore myld tuo ; nuer (dl_hlp)(); loe(andle); ) = )1 ,1vgra(pmcrts(f esl sprit(pth, /rottest/est/plug3/plugin/%s, a、o); ;)zl_dltr ,a(nepld = na* iov if(dle = ) cout dlope err en

13、dl; rur 0; typedef vod (*func_print)(); ;)f ,eldnah(ysl)tnirnuf( nirp_ld ir_cf f(l_it = ) ;ldne rore mysld tuo reur 0; ( ;)()tnirpl dcle(handle); ese i(strcmp(agv1, 2) = )/ 得到第二个 fnc 得参数 printf(path, /root/tettet/plug/pugin/%, a2、so); ;)al_dltr ,hta(nepld = lnah* do if(hnle ) out lon or edl; etur ;

14、tyef vod (*f_pnt)(); ;)f ,dah(yld)tnircnu( = tnirp_ld nirp_cnuf if(d_print = ) ;ldn rorre mysld tuoc retun 0; ( ;)()tnirp_d ;)elnah(esold ;0 nrutr 程序运行结果如图 3 所示: 图 3:插件输出 程序 4: cplugi enume ator 、h: #ifn cpuineumrtorh #den cpluginenueato_h #nld vector #nlude string uin nameace std; clss cpluinnerao

15、pulc: cpluienumratr(); virtal cplugnenumeraor(); bool gelugnnames(vctortring strpunnmes); ; #dif c luginen merato 、cpp: #include plugieumertor、h #nclud dirn、 #inclue stin、h cplienumeror::cpluginenumetor() cpuginenumertor:clugenmerto() bol lginnumtor::etplugnnmes(vtorsting vtpginame) dr *di = endir(、

16、plgi); if(dir = 0) retr fals; for(;;) ;)rid(ider = yrtnep* erid tcrts )0 = yrtnep(fi bra; if(tcmp(ntr-d_nam, 、) = 0) ntin; )0 = )、 ,eman_d-yrnp(pmrt(fi ;entnoc ;/nigulp/、 = ts girs sr = ery-d_nm; ;)rts(kcb_sp、semanigulptsv osedir(ir); rtun tue; c luginco t oller 、h #ifn pgncroler_ dfine clugincotrle

17、r_ #clude vecto clas ipritplgin; as cugincntroler ublc: ;)diov(llortncigupc vrual cpluiconrolle(oid); bool initializecntoll(vod); boo ntializecotrllr(void); ;)dov(lhsseo lob bol rocerequst(int funni); piat: st:veord * m_vhfoplun; ;niulv_m nigulptnirirotcv::dts; enf p uginco t ller 、cpp #inclde cplui

18、nconrolle、 #iclde cpuginenmeator、h includ printplugin、 #incd dln、h cpluincontroller:cplugincontroll(void) plinconrlle:cplugincontoller(vid) ol clugincontolr::inilizecotoller(vod) ;semanigulprtv gnrts:tsrotcev:dts clginenumeat enmerto; f(!enumeratr、etuginams(vstrluginname) ;eslf nter )+i ;)(eis、seman

19、igulpsvi ; =i i dengsnu(rof ;)*nigulptnirpi()tar_niulp*( tni fdpyt ;coptaer terc_nigul iprntp *ppluin = null; tr ,)(rtc、isennlprts(nepol = bilsih *divday); )lu ! btih(i ;)itsnih(cab_hsup、nigulprofhv_m ceateprc = (plugin_creae)lym(hnlib, crat obj); i(null ! craeprc) (creteprc)(pplugin); if(ppugin !=

20、nll) m_vpplugi、ush_ack(pplugn); ;eur nte bo cluntroller:procssrequst(t funtoni) )+ ;)(ezis、nigulpv_m i ;0 = i tni densnu(of f(mplugnigeid() = functoi) m_vpuii-pri(); ;karb ;eurt nrutr ool cplugicontroller:processhelp(oid) std:vecorst:sting vsrlunnae; lugnenmerato enmerat; if(!enumraor、gepluginnaes(v

21、strplginae) retrn false; )+ ;)(ezis、seagulrtsv ; 0= tni enisnu(ro ;)glpnrpi()etaerc_niglp( tni fedeyt ;cortaer etr_nigulp iprintplugin *lugin = nul; vo insi = dopen(vsluginames、c_str(), rtlda); f(hinsb ! nul) betaerc ,bsnih(ysld)etaerc_niu( copetaerc); if(null != reteproc) ( ;)nulpp()cpetaer f(pplin

22、 != null) ;)(pl-nigulp ;)iltsni(eolld ;eut nrue b cplugincontroller::unntalizontrollr() )+i ;)(eis、nigulrofhv_m i ; = i i dengis(rof ;)iniglprfhv_m(slcld retr true; iprint lu in 、h #pama once cas iprintpugin public: ;)(ngltnir ;)(nuptpi lautiv ;0 = )(pe dio lauri ;0 = )(tnirp diov lutriv ; = )(dieg

23、ni utiv; r l gi 、cp incde ipntlugin、 iprintplugin::printpugin() iritplgn:ipintlin() function 、cp #iclu ioream #inlude prinplugin、h sig mesac std; onst i fuc_i = 1; lass cpinpluin : public ntplug public: cpitplugn() vitual cpintplugin() virtual vid print() ot heo wod! enl; )(peh div uriv u siht : dcu

24、 di oitcnf uctin will prin helo word、 end; )dov(dieg tn ltriv return fuc_; ; exern c vod ceatbj(iprintplug *pplugin) ;nigulp guptnpc citts* ;niulp = niglpp funct o 1 、cpp iclue iosream #incld irintugn、 using nmespe std; cont nt fc_d ; clas prtplugi : plic iprintlugin pubi: cprintgi() vrtul cpintpgn(

25、) vitual void print() ;lde !nihc olleh uc viral vid hlp() cout functin i func_d : this fucion wi pint ell chna、 endl; )diov(dtg ti lautiv reurn funcid; ; exern c void creteobj(iprintplgin *ppluin) ;ngp ngulptnrpc citats* ;niulp = ulp main、 、 pp #inlud isrea nclude cplugincntoer、h #incd trng、h inclue

26、 ti、h ing namesace std; n mai(i argc, chr *arv) i(argc != ) cout paameters error e; etrn 0; )0 = )le ,1va(mcrt(f ;cp reortnoulc pc、prcesshep(); ;0 nruter ;)1vgra(o = dincnuf tni ;p relrtocniul 、intalizecontller(); ;)dinotnu(tserseorp、cp p、uniialzecotlr(); return 0; 程序运行结果如图 4 所示: 图:插件获取类对象 综合练习: cpl

27、ugi ontroll r 、pp include cplugincotrler、h #inclu luginenumear、h #inlude ipintplugin、h inclde lfn、h ilude strig、h cplgincontrolle::cpuginctrollr(voi) cpluncntoler:cplginonrller(vd) bool cpluincontroler:iniiaectoller(oi) ;emannigulptv gnirts:srotev:s ;rotreune rotremuengul )semannigulprt(semnigulpt、r

28、tamune!( ;esl nruer for(nsigned in i0 ; ivstrplginame、size(); i+) tpdf int (*plugin_crate)(prtpluin*); ;opeaerc etercigulp ;ll = ig* nuliri id* hinslib dn(vsrplginnams、ctr(), rtllzy); if(hinstlib ! ull) ;)bitsn(kcab_hp、nulprofhvm creaeo = (lgin_eate)lym(nstlib, ceateobj); if(ul ! createp) ( ;)nip()c

29、orpetaerc )ll =! niglpp(i ;)niupp(kab_hup、ngulpv_m ;eurt nrter bl cpluginontrol:prcessrequest(int fuctio) for(uniged nt i = 0; i m_vplugin、size(); i+) )inotcnuf = )(dite-igulp_m(i m_vpplugin-prnt(); ;eb return true; bool cplugctollr::pocssel(voi) ;smanigulrtsv gnits:rotcev:dt ;rreme roaemuneiguc )se

30、manniulprtsv(seannigupteg、roarene!(f ;esf nrtr f(unsigned int =0 ; strluginnams、sze(); i+) ;)*nigulptnirpi()etarc_igulp*( i fedepyt puin_ate crateoc; ;lun = iulpp ngulptni ;)a_dltr ,)(rtc、isemannigurtsv(nepold iltnih *diov )lu =! bilsni(i ,ltsnh(mysld)eaerc_nul( = ceterccreatebj); f(null != craeproc

31、) (creatprc)(plgin); if(pplugn != null) pplugn-el(); ;)inh(esolcld tun tre; bol cplugincotllr:ifocess(char fucti)/判断插件就是否存在 unsine int ; )+i ;)(ezis、igulppvm i ;0 = i(ro f(strcp(funcion, m_ppugin-gne() = 0) ;kaeb ; 在存件插/)(zs、nigupv_m (fi reun rue; e ;esla nrtr boo lginctroler::rocssfuncio(char *func

32、ion,car*dcuen)/执行插件功能 )+i ;)(zis、niupp_m i ;0 i tn engisnu(rf f(strmp(fnctin, m_pplugn-genme() = 0) 能功件插/;)tnemuod(nuf-nigup_;kae eturn tue; bool cpugionrlr:uninitalzcontrllr() )i ;)(ezs、ngulprofhv_m i ; = i ti dengnu(rof cls(m_hfopugini); ;ert ruer c l incontr er 、h #indef clgncnroler_h #efie cpugi

33、ncntrolerh #inlde veto cass ipintlun; ass cpluginontrller pulc: cplugincontrlle(id); virual cplginotroler(voi); o ntialzecontroller(void); bl nintializecoroller(voi); bool prcehep(vd); ;)dnitcuf tn(tsurscorp loob ool ifprocess(char *fncin); ;)temucod* rahc,nitcuf* rahc(oicnfssop oobpivat: std:eord *

34、 mvfolgi; ;nigulpv_m *nigulptnirprotcev:dts; #endif cp i en merator 、h #ifndf cpluginnumerator_h defie cplugnenetor_h #clude vetor #inude strn sn nmsace sd; las lugienurator publi: cpugnenurator(); virul clginnmeraor(); bool getpluinaes(veotrng strplginnmes); ; #enif cp ugi enum ator 、cpp inlde cinm

35、erator、 #nlde dien、 #iclude string、 cpluginenumera:cpugineumrtr() cpluginnmeror::plugnenuraor() bo cpugienumator::gpuginname(ectorsri vplugnes) dir *dir = endir(、/pugin); if(i = 0) etrn fale; r(;) stut t *ent = raddir(dir); )0 = yrnep(f reak; ) = )、 ,man_d-yrtep(pmrts(fi coninu; (st(penty-dname, 、)

36、= 0) cninue; strng str = 、/pln/; str = pey-d_ame; ;)ts(kabhup、semanlprtsv closedir(dr); rturn tru; m in 、c p #include iream #iclde clcotroler、h #nclude srng、h iclde stdlib、h usig namspace st; nt main(in arc, cha *arg) (rg = 2) f(rcmp(argv, hel) = 0)/帮助功能 ;cp rellortnocnigc ;)(plesecorp、cp eturn ; se

37、 ;)1vgr(ota = otcnf tn cplugincontller pc; ;)(relortnocziatni、cp p、pcessreques(unctonid); ;)(rllortncilaitnin、cp retun ; )3 = ra(i esle ;cp rlornocglpc har *function rgv1; / ;s、=+itcnuf 名件文得作操/;2vga tnemd* rah ;)(relortnoceilaiini、cp if(c、ifprcess(fcton)=false)/判断插件就是否存在 cou no th plugin! en; /esl ;

38、)neucod,noiuf(itcnfssorp、cp ; ;)(relrnoezilatiniu、cp eturn 0; els ;ldne rre sretearap uc ret 0; 插件: r ntplug n 、cpp #clud printplun、 ipritplugn::ipintugin() ipintpli:ipritluin() i rin plugin 、h #pgma once class ipritplugin pui: pintlugin(); vitul pntpgn(); ;0 )(pe di lativ ; = )(tr dov lautri ; = )(dite tni atri vial hr * genam() = ;/添加部分 ;0 )*ra(nu div laurv; lin 、cpp incud iostea #nclude iprintplugin、h #incd unisd、/read(fie) inde cnl、h #nclude strig、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论