范家寬os2實驗報告操作系統(tǒng)上機_第1頁
范家寬os2實驗報告操作系統(tǒng)上機_第2頁
范家寬os2實驗報告操作系統(tǒng)上機_第3頁
范家寬os2實驗報告操作系統(tǒng)上機_第4頁
范家寬os2實驗報告操作系統(tǒng)上機_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

操作系統(tǒng):Windows7編程軟件:gVim7.3進程是操作系統(tǒng)最重要的概念之一,進程調(diào)度又是操作系統(tǒng)的主要內(nèi)容。本實習要設計一個有n個進程的進程調(diào)度程序。每個進程由一個進程控制塊(PCB)表示。CPU2~3種不同的調(diào)度算法,運行時可任意選一種,以利于各種算法的首先我了一個結(jié)構體通過重載運算符實現(xiàn)了比//ContainerofPriorityAlgorithmProcessstructPriorityAlgorithmPro{int //IdofintPriorityNum; //PriorityNumberintCPUTime; //UsedTimeint //Needofchar //TheStatusofbooloperator<(constPriorityAlgorithmPro&Compare){return}friendistream&operator>>(istream&in,PriorityAlgorithmPro程序包含兩個類每個類封裝了算法的所有操作PriorityAlgorithmRoundRobinAlgorithm。在里面用了STL容器來PCB記錄項位置)1,然后比較占用處1的進程優(yōu)先數(shù)最高,iCPU1i則最1中參加調(diào)度,如果在一個時間片內(nèi)該進程完不2,即優(yōu)先級要降低,但下一次運行的時間可加長(即時間片加長了。以11freopen("out.txt","w",stdout);我們可以得到文本形式的輸出TYPETHERUNNINGPROC. WAITINGQUEUE34113459000003634WWWW5410RUNNINGPROC. WAITINGQUEUE34113459000003634WWWW5410RUNNINGPROC. WAITINGQUEUE34113459000003634WWWW5410RUNNINGPROC. WAITINGQUEUE4113459000003634WRWW5210RUNNINGPROC. WAITINGQUEUE3113459001003634WWRW5130RUNNINGPROC. WAITINGQUEUE4113459001103634WRWW5410RUNNINGPROC. WAITINGQUEUE3113459002103634WWRW5130RUNNINGPROC. WAITINGQUEUE4113459002203634WRWW5410RUNNINGPROC. WAITINGQUEUE3113459003203634WWRW5130RUNNINGPROC. WAITINGQUEUE113459003303634WRWW5410RUNNINGPROC. 1513459004303634WRWW5130RUNNINGPROC. WAITINGQUEUE113459005303634WRWW5130RUNNINGPROC. WAITINGQUEUE513459006303634RWWW5130RUNNINGPROC. WAITINGQUEUE513456016303634RWWW5130RUNNINGPROC. WAITINGQUEUE5 12 3026303634RWWW5130RUNNINGPROC. WAITINGQUEUE13450036303634WWWR5130RUNNINGPROC. WAITINGQUEUE13450-36313634WWWR5130RUNNINGPROC. WAITINGQUEUE13450-36323634WWWR5130RUNNINGPROC. WAITINGQUEUE13450-36333634WWWR 5 SYSTEMFINISHEDTYPETHERUNNINGPROC. WAITINGQUEUE2341345213 00003634RWWW2450RUNNINGPROC. WAITINGQUEUE2341345213 10003634RWWW2450RUNNINGPROC. WAITINGQUEUE3451345213 20003634WWWW0451RUNNINGPROC. WAITINGQUEUE4511345213 20003634WRWW2451RUNNINGPROC. WAITINGQUEUE4511345213 21003634WRWW2451RUNNINGPROC. WAITINGQUEUE4511345213 22003634WRWW2451RUNNINGPROC. WAITINGQUEUE5121345213 23003634WWRW2051RUNNINGPROC. WAITINGQUEUE5121345213 23103634WWRW2051RUNNINGPROC. WAITINGQUEUE5121345213 23203634WWRW2051RUNNINGPROC. WAITINGQUEUE1213452133223303634WWWR2401RUNNINGPROC. WAITINGQUEUE1213452133223313634WWWR2401RUNNINGPROC. WAITINGQUEUE231345213 23323634RWWW2450RUNNINGPROC. WAITINGQUEUE313452133233323634 W 2 RUNNINGPROC. WAITINGQUEUE31345213 33323634WWWW0451RUNNINGPROC. WAITINGQUEUE51345213 33323634WRWW2451RUNNINGPROC. WAITINGQUEUE51345213 34323634WRWW2451RUNNINGPROC. WAITINGQUEUE51345213 35323634WRWW2451RUNNINGPROC. WAITINGQUEUE13452133236323634WWWR2051RUNNINGPROC. WAITINGQUEUE13452133236333634WWWR2051SYSTEMFINISHEDTYPETHE使更能體現(xiàn)C語言的特性。如何在程序中模擬進程運行的時間片?c++STL標準庫,運算符重載等。實現(xiàn)算法本身是十a(chǎn)cm題。所以我在封裝上下了一些功夫,把算法封成了對#include<iostream>#include<fstream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<stack>#defineLEN101usingnamespace//ContainerofPriorityAlgorithmProcessstructPriorityAlgorithmPro{intid; //IdofprocessintPriorityNum; //PriorityNumberintCPUTime; //UsedTimeint //Needofchar //TheStatusofbooloperator<(constPriorityAlgorithmPro&Compare){return}friendistream&operator>>(istream&in,PriorityAlgorithmProistream&operator>>(istream&in,PriorityAlgorithmPro{in>>Pro.id>>Pro.PriorityNum>>Pro.NeedTime;Pro.CPUTime=0;Pro.ProStatus='W';return}//ContainerofRoundRobinAlgorithmProcessstructRoundRobinAlgorithmPro{int //IdofintRoundRobinTime;//RoundrobintimeintCPUTime; //UsedTimeint //Needofchar //TheStatusoffriendistream&operator>>(istream&in,RoundRobinAlgorithmProistream&operator>>(istream&in,RoundRobinAlgorithmPro{in>>Pro.id>>Pro.RoundRobinTime>>Pro.CPUTime=0;Pro.ProStatus='W';returnin;}//FunctionforchooseingtheAlgorithminlineintChooseMod(charChooseStr[]){if(!strcmp(ChooseStr,"PRIORITY")||!strcmp(ChooseStr,"priority"))return1;if(!strcmp(ChooseStr,"roundrobin")||!strcmp(ChooseStr,"ROUNDROBIN"))return2;}//ClassforPriorityAlgorithmclassPriorityAlgorithm{vector<PriorityAlgorithmPro>ProArray;intProNum;voidint "=========================================================="<<cout<<"RUNNING WAITINGQUEUE"<<cout<< for(inti=0;i<ProNum;if(ProArray[i].ProStatus=='W'&&ProArray[i].CPUTime!=ProArray[i].NeedTime)cout<<ProArray[i].id<<'';cout<< "=========================================================="<<cout<< for(inti=1;i<=ProNum;i++)cout<<i<<'\t';cout<<endl;cout<<"PRIORITY for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].PriorityNum;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<endl;cout<< for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].CPUTime;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<endl;cout<< for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].NeedTime;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<endl;cout<< for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].ProStatus;for(inti=1;i<=ProNum;i++)cout<<(char)buff[i]<<'\t';cout<<endl;cout<<"NEXT }

for(inti=0;i<ProNum-1;i++)buff[ProArray[i].id]=ProArray[i+1].id;buff[ProArray[ProNum-1].id]=0;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<< //Clearthearray}//FunctionforreadingprocessvoidRead(){cin>>for(inti=0;i<ProNum;i++){PriorityAlgorithmProp;cin>>p;}}voidWork(){ //AlgorithmforPriorityProsort(ProArray.begin(),ProArray.end());//sortforPriorityNumberintpos=0; pos!=ProNum)pos++;//FindthefirstnotfinishedProcessif(pos==ProNum)break; //Allprocesshasbeenfinished.EndedProArray[pos].ProStatus='R'; //Output //RefleshtheProimformtionProArray[pos].ProStatus=}}classRoundRobinAlgorithm{vector<RoundRobinAlgorithmPro>ProArray;intProNum;voidint "=========================================================="<<cout<<"RUNNING WAITINGQUEUE"<<cout<< for(inti=0;i<ProNum;if(ProArray[i].ProStatus=='W'&&cout<<ProArray[i].id<<'';cout<<endl; "=========================================================="<<cout<< for(inti=1;i<=ProNum;i++)cout<<i<<'\t';cout<<endl;cout<<"ROUNDROBINTIME for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].RoundRobinTime;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<endl;cout<< for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].CPUTime;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<endl;cout<< for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].NeedTime;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<endl;cout<< for(inti=0;i<ProNum;i++)buff[ProArray[i].id]=ProArray[i].ProStatus;for(inti=1;i<=ProNum;i++)cout<<(char)buff[i]<<'\t';cout<<endl;cout<<"NEXT for(inti=0;i<ProNum-1;i++)buff[ProArray[i].id]=ProArray[i+1].id;buff[ProArray[ProNum-1].id]=0;for(inti=1;i<=ProNum;i++)cout<<buff[i]<<'\t';cout<<} //Clearthearray}//FunctionforreadingprocessvoidRead(){cin>>for(inti=0;i<ProNum;i++){RoundRobinAlgorithmProp;cin>>p; }}voidWork(){ //AlgorithmforPriorityProinti=0;intpos= pos!=ProNum)pos++;//FindthefirstnotfinishedProcessif(pos==ProNum) //AllprocesshasbeenProArray[pos].ProStatus= //OutputProArray[pos].ProStatus='W';}}}int{freopen("in.txt","r",freopen("out.txt","w",charChooseStr[LEN]; //StringwhichiscontainedinputimformatiomPriorityAlgorithmPA; //RuningPriorityAlgorithmRoundRobinAlgorithmRRA; //RuningPriorityAlgorithmcout<<"TYPETHEALGORITHM:"<<endl;//Hintimformatiomcin>>ChooseStr; //Inputtypeofalgorithmif(strcmp(ChooseStr,"END")==0)break;switch(ChooseMod(ChooseStr))//Choosealgorithm{casecasecase3:} "=========================================================="<<cout<<"SYSTEMFINISHED"<<endl;//Ending}return}操作系統(tǒng):MacOSX編程軟件:Xcode,近年來,由于大規(guī)模集成電路(LSI)和超大規(guī)模集成電路(VLSI)技術的發(fā)展,使器的所以,提高器的效率始終是操作系統(tǒng)研究的重要課題之一。虛擬技術是用來擴大內(nèi)存容量的一種重要方法。學生應獨立地用高級語言編寫幾個常用的分配算法,并設計一個管理的模擬程序,對各種算法進行分析比較,評測其性能優(yōu)劣,從而加深對這些算法,為了比較模擬管理,可預先生成一個大致符合實際情況的指令地址流。然后本程序采用頁式分配管理方案并通過分析計算不同頁面淘汰算法情況下的命中率來比較各種算法的優(yōu)劣另外也考慮到改變頁面大小和實際器容量對計算結(jié)果的影25%的指令均勻散布地址部分順序執(zhí)行一條指令(m+1256432K825632個虛頁0條~70(對應虛存地址為8條~151(對應虛存地址為198條~25531頁(對應虛存地址為32結(jié)合思考題,本程序計算并輸出以下各種算法在不同內(nèi)存容量下中率最佳淘汰算法最近最少使用算法合要求的指令序列,進試,模擬有限內(nèi)存的分配過程,統(tǒng)計。但是為了實函數(shù),包括統(tǒng)計各自中率。typedef {int //int //int //計數(shù)器,1個周期該頁面的次int //時typedefstructpfc_struct*頁面控制結(jié)構,調(diào)度算法的控制結(jié)構{intintstructpfc_structpfc_typepfc[xy], _head,*busy_head,OutUsed最優(yōu)替換算法,即OPT算法(OptimalRecement。上面介紹的幾種頁面替換算法主要是以主器中頁面調(diào)度情況的歷史信息為依據(jù)的它假設將來主器中的頁面調(diào)度情況與過去一段時間內(nèi)主器中的頁面調(diào)度情況是相同的。顯然,這種假設不總是正確的。最好的算法應該是選擇將來最久不被的頁面作為被替換的頁面,這種替換算法中率一定是最高的,它就是最優(yōu)替換算法。要實現(xiàn)OPT算法,唯一的辦法是壞的標準在其它條件相同的情況下哪一種頁面替換算法中率與OPT算法最接近,1.FIFO2.LRU3.OPT,從以上結(jié)果可知在內(nèi)存頁面較少時三種算法中率差別不大內(nèi)存頁面再增加一點后,都在60%~70%左右,而內(nèi)存頁面到達30左右頁面時提高較多,大部分指令,個頁面以下的情況時卻最高OPT算法顯然是一個比較好的頁面調(diào)度算法。#include<stdio.h>#include<stdlib.h>#include<time.h>#defineTRUE#defineFALSE zllc /*指令流長 /*虛頁長typedef /*頁面結(jié)構{

int //int //int //計數(shù)器,1個周期該頁面的次int //時pc typedefstructpfc_struct/*頁面控制結(jié)構,調(diào)度算法的控制結(jié)構{intpn;intpfn;structpfc_structpfc_typepfc[xy], _head,*busy_head,intzhihuan,a[zllc]; //a[]為指令序列//intpage[zllc],offset[zllc]; int{ {{printf("Wheni==%d,Error,s==%d\n",i,s);}printf("a[%d+2],anumberwhichis:%dand} /*將指令序列變換成頁地址流{}printf("Thealgorithmis:(1->FIFO;2->LRU;3->OPT):"); printf("page pages_in/total /*432個頁面{switch(command){case1:case2:case3:}}return}/*pf表示內(nèi)存的塊數(shù)intinitialize(int{inti;{ /*頁面控制結(jié)構中的次數(shù)為0*/ }for(i=0;i<pf-1;i++)/*建立pfc[i-1]和pfc[i]之間的{} return0;}intFIFO(int {intpfc_type /*中間變量 { /*頁面失效{ { 員_head=busy_head;/*釋放忙頁面隊列的第一個頁面 } /*使busynull*/{}{}

busy_tail=busy_head=//busy_tail后面_head=p;//}} return0;}intLRU(int /*leastrecently{int /*minj為最小值下標{ /*頁面失效{ { /*找出time的最小值*/{{}} }}{}}

_head=_head- //減少一個頁pl[page[i]].time=present_time;//命中則增加該單元的次 return0;}intOPT(int {inti,j,max,maxpage,dist[xy];{ /*頁面失效{ {{的 }{{}}{}}}} return0;}操作系統(tǒng):MacOSX編程工具:Xcoden個用戶的文件系統(tǒng),ml系統(tǒng)應能檢查打入命令的正確性,creat建立文件。delete刪除文件。open打開文件。close關閉文件。read讀文件。write寫文件。5程序采用二級文件,即設置了主文件(MFD)和用戶文件(UFD)件主(即用戶)及他們的區(qū)指針;后者應給出每個文件主占有的文件,即文件名,保護碼,文件長度以及他們存放的位置等。另外為打開文件設置了運行文件(AFD),在文件打開時應填入打開文件號,次打開保護碼和讀寫指針等。為了便于實現(xiàn),對文件的讀寫作了簡化,在執(zhí)行讀寫命令時,只修改讀寫指針,并不進行實際文件的讀寫操作。概述:(130-只可讀,1-只可寫,2-可讀寫。另外對于文件打開與關閉的操作設置了標識模塊:7void //intcreate(intk) voidDelete(intk) voidopen(intk,intpro)//readvoidclose(int //voidWrite(int //voidShow(int //打 k為用戶編號,pro圖1.主文 和用戶文2.打開文件3.4.main()5.Incitialize()代碼create(intk)函數(shù):6.create(intk)Delete(intk)7.Delete(intk)close操作open(intk,intpro)8.open(intk,intpro)打開文件即瀏覽文件,此處進行了簡單的處理,若文件已打開則直接退出,打開文件AFDopenCount用來opennum(5)close(intk)9.close(intk)close時還要保證打開文 結(jié)構AFD中的相關信息已除去,并更新打開文件計數(shù)10.Write(intk)length基礎上加上用戶鍵入值。另外,關閉的文件不能Writeopen操作。Show(intk)圖11. k)函數(shù)代本函數(shù)打印用戶12.13.14.Createtest115.Createtest2圖16.再次顯 文17.18.write19.對可讀寫文件進行寫操作,但文件尚未打開,write20.test221.test2write22.Deletetest123.closetest1文件后再delete25.open526.5open/read操作,提示超過數(shù)量限制件權限的概念,加深了對于操作系統(tǒng)的認識。(#include<iostream>usingnamespacestd;#defineUsernum#defineFilenum#defineopennum5intopenCount;structchar*filename;intpro;//intlength;//intflag;//structAfdintOpenNo;//打開文件號intPro; }structMfdcharUserName[9];//用戶名UfdUFD[Filenum];//用戶}voidIncitialize()//{inti,j;{}for(i=0;i<opennum;i++){}}intcreate(intk)//{inti=0,length,pro;charname[10];{{}

return{return0;}printf("請輸入文件的保護碼(0-1-2-可讀寫):");{{MFD[k].UFD[i].filename=(char*)malloc(10*sizeof(char));strcpy(MFD[k].UFD[i].filename,name);}}return}voidDelete(intk)//{intchar{{{}}}

}voidopen(intk,intpro)//{intcharname[10];{while(i<Filenum&&{if(strcmp(MFD[k].UFD[i].filename,{if(MFD[k].UFD[i].flag==1)}

{}

return;}}}

voidclose(intk)//{intchar{for(j=0;j<opennum;{if{}}}{}

elsei++;}voidWrite(intk)//{intintlen,length;charname[10];if(strcmp(MFD[k].UFD[i].filename,name)==0){}{}{}

elsei++;}voidShow(intk)//打 {intfor(i=0;i<=9;i++){{}}printf("totalfile(s):}intmain(intargc,constchar*{ while(command!=0){switch(command){casecasecase3:casecasecase} }return0;}操作系統(tǒng):RedHatEnterpriseLinuxgcc和Linux學會使用Linux文件系統(tǒng)令界面和程序界面的基本要領復習操作系統(tǒng)中有關文件系統(tǒng)的知識,熟悉文件的類型、i節(jié)點、文件屬性、文件系統(tǒng)操作Linux文件系統(tǒng)的特點、分類。vic程序(假定程序文件名為prog1.c)$gcc-oprog1.o $cc-oprog1.o用s命令查看Linux文件類型顯示的結(jié)果中每行的第一個字母就是Linux的文件類型。 -dbc(命名管道psockets符號(軟l用s命令了解Linux文件系統(tǒng) $cd$ 中是可執(zhí)行程序;/home下包括了每個用戶主 找找一個其 中的文件,如:/home/zzl/mytest.c執(zhí)$ln/home/zzl/mytest.c (建立硬文件$ –s/home/zzl/mytest.c (建立符號文件區(qū)別在于是否新建i結(jié)點,體現(xiàn)在i結(jié)點號不同,硬與源文件相同,軟是新建的 #defineTIME_STRING_LENchar*time2String(time_ttm,char{structtm*local;returnbuf;}intShowFileInfo(char{structstatchartimeBuf[TIME_STRING_LEN];{perror("lstat()error");return1;}printf("Ondevice(major/minor):%d%d,inodenumber:%ld\n",printf("Size:%ld\tType:%07o\tbuf.st_size,buf.st_mode&S_IFMT,buf.st_mode&~(S_IFMT));printf("Owerid:%d\tGroupid:%d\tNumberofhardlinks:%d\n",printf("Lastaccess:%s\n",time2String(buf.st_atime,timeBuf));printf("Lastmodifyinode:%s\n\n",time2String(buf.st_atime,timeBuf));return0;}intmain(intargc,char{inti,ret;{}return}思考:Linuxinode是不是很有特色?找一些這方面的資料,熟悉文件系統(tǒng)的實現(xiàn)#defineSHW_ADR(ID,I)printf("Theid%s\tisatadr:%8X\n",ID,&I);intmain(){voidshowdata();pid_tpid;printf("Parentprocess:\n");pid=fork();printf("\nChildprocess\n");//showdatashowdata}return}void{externintprintf("Adretext:%8x\tAdredata:%8xAdr}(1)intmain(intargc,char**argv){printf("Filenumberwrong!\n\n");return1;}char*outfile=*infile1=argv[2],*infile2=argv[3];FILE*out=fopen(outfile,"w"),*in1=fopen(infile1,*in2=fopen(infile2,"r");chartemp;if(out==NULL||in1==NULL||in2==NULL){printf("Error:OpenFileFailed\n");return}temp=fgetc(in1);fputc(temp,out);}temp=fgetc(in2);fputc(temp,out);}od(outfile0644);***更改權限***out=fopen(outfile,"r");temp=fgetc(out);}return}區(qū)別在于是否建立新的inode。硬文件只建立新 項,源文件和文件共inode;而符號文件的文件不但有新 實驗3的結(jié)果就是最好的例子,源文件new的inode號為179124,分別建立硬文件hard與符號文件soft,查看發(fā)現(xiàn)hard的inode號與new相同,soft有新的inode號6查找資料討論Linux采用了成組法管理空閑盤塊inodeVFS的思想類似,Linux系統(tǒng)采用一類通用的設備文件統(tǒng)一管理硬件設備。通過這個操作系統(tǒng):WindowsServer從系統(tǒng)分析的角度出發(fā),了解FAT文件系統(tǒng)的組織結(jié)構和文件的方式。進一步理 復習文件系統(tǒng)的結(jié)構概念。復習文件空間管理方法3FAT察看文 表中文 結(jié)構了解用簇號鏈映射的文件鏈式結(jié)構分 文件的組成DEBUGFAT進入Windows令行,進入debug環(huán)命令將0號驅(qū)動器中,邏輯扇區(qū)號從0開始的共21H個扇區(qū)讀入內(nèi)存,放在DS:0000命令:L000211.44MFAT12命令:D0000分析文件分配表結(jié)構,了解用簇鏈映射的文件的鏈式結(jié)構命令:D觀察1.44M軟盤中文件 表FDT以及文件 命令:D2600觀察1.44M軟盤中文 表的長文件 結(jié)FDTBAK的文件找到文件123.TXT的位置。調(diào)出文件的第二塊將文件的第512字節(jié)開始Year000001002003F0FFFFFF0020030031.44MB軟盤的文件表FDT14個扇區(qū),每個文件的登記項占用32個字節(jié),用作的一個扇區(qū)(512)512/32=16因此,1.44MB軟盤的根下最多可建文件或子2241~2 項和一個 項2)扇這里是因為HappyNewYear只覆蓋了oworld這幾個字符,后面的幾LinuxLinux命令:lsl/devwc件data.out中,計算設備文件個數(shù)。命令:ls/dev|wc>命令:cat實驗題目:實驗(八)、模擬Lnux的s ,實現(xiàn)一個命令解釋器。從標準輸入讀入命令行并執(zhí)行。每次只處理一個命令不過可以是一個復雜命令例如可以包括管道輸入輸出重定向執(zhí)行程序一共可分為十個模塊每個模塊基本上是一個函數(shù)各模塊功能如下:dh一些宏定義和數(shù)據(jù)結(jié)構的定義;an.c過程;Init.c初始化模包括兩個初始化一個是啟動s 時初始化int_nce(),另個是每運行完一條命令后的初始化 mand(;、ln.c得到當前輸入命令; .c對輸入令進行語法分析,將命令分解為簡單命令,得到簡單命令的數(shù)組;Get_word.c得到下一個標識符; .c執(zhí)行一 .c執(zhí)行輸入令;Get_simarg.c對一條簡單命令進行語法分析,得到簡單命令的名稱和參數(shù);Check.c查看字符串是否匹配,inputln[]數(shù)組中inputlnptr指向的字符串和check函數(shù)的參數(shù)字符串是否匹配。頭文件定義了一些在各個模塊公用的數(shù)據(jù)結(jié)構。執(zhí)行時從主過程main開始,在其中讀入、解釋并運行用戶輸入令。命令處理的基本過程如下圖其它函數(shù)用來實現(xiàn)一些輔助功能?!咎崾尽勘緦嶒灥脑O計可以在Linux中實現(xiàn)也可以在Windows環(huán)境下進行。若在Linux中實現(xiàn),參考《實驗指導》第五部分“Linux編程系統(tǒng)調(diào)用”中有關“進程管理的系統(tǒng)調(diào)用”和“標準輸入輸出”的有關內(nèi)容。若在Windows環(huán)境下進行,則請參考相關C函數(shù)庫。首先介紹一下我實現(xiàn)的s包含哪些命令。cdls顯示當 文od改變文件權renameopen打開文件write寫文件簡單管道命令首先,在設計前由于大部分才做都是針對當前來操作的。所以名應該是一個十分string變臉保存當前前,在每次開始操作前都先設置一下。第二點是我對于命令的處理,我們知道s中的明亮十分復雜首先操作有好多種,然后voidDoSimple_cd(string&localdir,stringstream&ss){stringgo,local=localdir;ss>>go;local+=go;intisgo=for(inti=0;i<go.size();i++)if(go[i]=='.'){isgo=0;}if(GoToDir(local))localdir=}BackToDir(localdir,}dd然后再交給相應的函數(shù)進行處理。若是前進我們只需要調(diào)用Gotodir就可以否則則是BacktodirvoidDoRcon(stringlocaldir,stringstream&ss){stringop,filename,buff="",wd;stringstreamos;ss>>if(op=="ls"){DoSimple_ls(localdir,os,0);stringstreamfilename;filename<<op;if(!DoSimple_open(localdir,filename,os,0)){cout<<"commandisnotsupported!"<<endl;return;}}ss>>op;ss>>cout<<"filename:"<<filename<<endl;while(os>>wd)buff+=(wd+"\n");intfile=open(filename.c_str(),O_RDWR);if(file<0){cout<<"Cannotopen!"<<}write(file,buff.c_str(),buff.size()*(sizeof(char)));}在函數(shù)中我們可以看見首先我調(diào)用了簡單命令的函數(shù)然后將他的輸出放入了os中(一個stringstream)然后再將流中的東西放入我要重定向的文件當中。首先設置 cdls在s中修改out.txt的內(nèi)容out.txt打開sout.txt模塊化、標準化是系統(tǒng)對外提供了簡單抽象、清晰而統(tǒng)一的接口硬件的具體信息IO這個實驗是模擬一個s,算是所有實驗中比較復雜的一個吧,首先由于這個實驗要用S#include"Sint{ freopen("in.txt","r",stringlocaldir="/home/xiaohao/";charcmd[PATHLEN]={};cout<<"S||"<<localdir<<":";if(!strcmp(cmd,"exit")){cout<<"Bye!"<<endl;}Sprocess(localdir,cmd);cout<<"process!"<<endl;}return}S

SS#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<iostream>#include<fstream>#include<sstream>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<list>#include<map>#include<set>#include<sys/stat.h>#include<sys/types.h>#include<unistd.h>#include<dirent.h>#include<fcntl.h>usingnamespace#defineMP(a,b)make_pair(a,b)#definePB(a)push_back(a)constintINF=0x7fffffff;constintPATHLEN=110;voidSinit(stringvoidSprocess(string&localdir,stringcmd);voidDoPipe(stringlocaldir,stringstream&ss);voidDoRcon(stringlocaldir,stringstream&ss);voidDoSimple_ls(stringlocaldir,stringstream&os,ints#include"SvoidSinit(string cout<< etoS"<<}s#include"SvoidDoSimple_ls(stringlocaldir,stringstream&os,inttag){DIRstructdirentdir=opendir(localdir.c_str());while((ptr=readdir(dir))!=NULL)os<<ptr->d_name<<"\n"; printf("%s\n",ptr->d_name);if(tag==stringwd;while(os>>wd)cout<<wd<<}}//實現(xiàn)當 變//到達當 ,若是路徑名則路徑不變輸出錯boolGoToDir(string&local){if(local[local.size()-1]!='/')local+='/';return}cout<<"Thepath"""<<local<<"""isnotexist!"<<endl;returnfalse;}}voidBackOnce(string&local){if(local=="/")return;intlen=local.size(),pos;for(inti=len-2;i>=0;i--if(local[i]=='/'){pos=i;}}charback[PATHLEN];for(inti=0;i<=pos;i++){back[i]=}back[pos+1]=0;stringret(back);local=ret;}//后 處voidBackToDir(string&localdir,stringgo){cout<<go<<''<<localdir<<endl;intpos=-1,num=0;for(inti=go.size()-1;i>=0;i--if(pos<0&&go[i]=='.')pos=i+1;if(go[i]=='.'){numif(num%2==0)}}stringlocal=get_current_dir_name();for(inti=pos;i<go.size();i++){local+=}}voidDoSimple_cd(string&localdir,stringstream&ss){stringgo,local=localdir;ss>>go;local+=go;intisgo=for(inti=0;i<go.size();i++)if(go[i]=='.'){isgo=0;}if(GoToDir(local))localdir=}BackToDir(localdir,}voidDoSimple_rename(stringlocaldir,stringstream&ss){stringnw,od;ss>>od>>if(!rename(od.c_str(),nw.c_str()))cout<<"success!"<<endl;elsecout<<"unsuccess!"<<endl;}voidDoSimple_od(stringlocaldir,stringstream&ss){stringmod;mode_tt=0;ss>>mod;if(mod[0]=='1')t|=S_IRUSR;//readif(mod[1]=='1')t|=S_IWUSR;od(localdir.c_str(),}//opens

溫馨提示

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

評論

0/150

提交評論