操作系統(tǒng) 文件系統(tǒng) 實驗程序_第1頁
操作系統(tǒng) 文件系統(tǒng) 實驗程序_第2頁
操作系統(tǒng) 文件系統(tǒng) 實驗程序_第3頁
操作系統(tǒng) 文件系統(tǒng) 實驗程序_第4頁
操作系統(tǒng) 文件系統(tǒng) 實驗程序_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

一.試驗?zāi)康挠酶呒壵Z言編寫和調(diào)試一種簡樸的文獻(xiàn)系統(tǒng),模擬文獻(xiàn)管理的工作過程。從而對多種文獻(xiàn)操作命令的實質(zhì)內(nèi)容和執(zhí)行過程有比較深入的理解。二、試驗規(guī)定規(guī)定設(shè)計一種n個顧客的文獻(xiàn)系統(tǒng),每次顧客可保留m個文獻(xiàn),顧客在一次運(yùn)行中只能打開一種文獻(xiàn),對文獻(xiàn)必須設(shè)置保護(hù)措施,且至少有Create、delete、open、close、read、write等命令。程序采用二級文獻(xiàn)目錄(即設(shè)置主目錄[MFD])和顧客文獻(xiàn)目錄(UFD)。此外,為打開文獻(xiàn)設(shè)置了運(yùn)行文獻(xiàn)目錄(AFD)。在執(zhí)行讀寫命令時,需改讀寫指針。因系統(tǒng)小,文獻(xiàn)目錄的檢索使用了簡樸的線性搜索。文獻(xiàn)保護(hù)簡樸使用了三位保護(hù)碼:容許讀寫執(zhí)行、對應(yīng)位為1,對應(yīng)位為0,則表達(dá)不容許讀寫、執(zhí)行。程序中使用的重要設(shè)計構(gòu)造如下:主文獻(xiàn)目錄和顧客文獻(xiàn)目錄(MFD、UFD)、打開文獻(xiàn)目錄(AFD)(即運(yùn)行文獻(xiàn)目錄)MDF顧客名文獻(xiàn)目錄指針UFD文獻(xiàn)名保護(hù)碼文獻(xiàn)長度AFD打開文獻(xiàn)名打開保護(hù)碼讀寫指針文獻(xiàn)系統(tǒng)算法的流程圖如下:#include<stdio.h>#include<string.h>#defineN10#defineL10#defineS6structmfd_type{ charuname[20]; intuaddr;};structufd_type{ charfname[20]; charfattr[10]; intrecordl; intaddrf;};structuof_type{ charfname[20]; charfattr[10]; intrecordl; charfstatue;//1:建立0:打開 intreadp; intwritep;};intfdph[N*L];//寄存文獻(xiàn)在磁盤上的第一種空間編號intfdpt[N*L];//寄存文獻(xiàn)在磁盤上的最末一種空間編號intdisk[400];//寄存磁盤空閑塊號intdiskt,diskh;//空閑塊的尾、首指針最末structmfd_typemfd[N];structufd_typeufd[N*L];structuof_typeuof[N*S];inttemp,mi,ni,uno,ucounter;voidcreate(charcfname[20],intcrecordl,charcfattr[10]){ intcltemp1=uno*L,cltemp2=(uno+1)*L,frd;while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,cfname)!=0)) cltemp1++; if(strcmp(ufd[cltemp1].fname,cfname)!=0) { cltemp1=uno*L; while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,"")!=0))cltemp1++; if(strcmp(ufd[cltemp1].fname,"")==0) { frd=cltemp1; cltemp1=uno*S; cltemp2=(uno+1)*S; while((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,"")!=0))cltemp1++; if(strcmp(uof[cltemp1].fname,"")==0) { if(disk[diskh]!=-1) { strcpy(uof[cltemp1].fname,cfname); strcpy(uof[cltemp1].fattr,cfattr); uof[cltemp1].recordl=crecordl; uof[cltemp1].fstatue=1; uof[cltemp1].readp=disk[diskh]; uof[cltemp1].writep=disk[diskh]; fdph[frd]=disk[diskh]; fdpt[frd]=disk[diskh]; strcpy(ufd[frd].fname,cfname); strcpy(ufd[frd].fattr,cfattr); ufd[frd].recordl=crecordl; ufd[frd].addrf=disk[diskh]; diskh=disk[diskh]; printf("%s\n","文獻(xiàn)建立成功!"); } elseprintf("%s\n","磁盤沒有空間,不能建文獻(xiàn)!"); } elseprintf("%s\n","沒有空的登記攔1,不能建文獻(xiàn)"); } elseprintf("%s\n","沒有空的登記攔2,不能建文獻(xiàn)"); } elseprintf("%s\n","同名文獻(xiàn)不能建立!");};voidopen(charpfname[20],charooptype[10]){ intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S;while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,pfname)!=0))cltemp1++; if(strcmp(ufd[cltemp1].fname,pfname)==0) { while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,pfname)!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,pfname)==0)//有文獻(xiàn) { if(uof[cltemp3].fstatue==0)printf("%s\n","文獻(xiàn)已打開!"); elseprintf("%s\n","此文獻(xiàn)正在建立,不能打開!"); } else//無文獻(xiàn) { if(strcmp(ufd[cltemp1].fattr,ooptype)!=0)printf("%s\n","操作不合法,不能打開!"); else { cltemp3=uno*S; while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,"")!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,"")) printf("%s\n","在已開表中沒有空攔,不能打開文獻(xiàn)!"); else { strcpy(uof[cltemp3].fname,pfname); uof[cltemp3].recordl=ufd[cltemp1].recordl; strcpy(uof[cltemp3].fattr,ufd[cltemp1].fattr); uof[cltemp3].readp=ufd[cltemp1].addrf; uof[cltemp3].writep=ufd[cltemp1].addrf; uof[cltemp3].fstatue=0; printf("%s\n","打開文獻(xiàn)成功!"); } } } } else printf("%s\n","此文獻(xiàn)已不存在,不能打開!");};voidwrite(charwfname[20],intwrecordno){ intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S;while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,wfname)!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,wfname))printf("文獻(xiàn)沒有建立或打開,不能寫");//在已開文獻(xiàn)中沒有次文獻(xiàn),不能寫 else//文獻(xiàn)建立或打開 { if(uof[cltemp3].fstatue)//建立 { printf("%s%d%s","寫第",uof[cltemp3].writep,"塊空間!"); if(disk[diskt]==-1) printf("%s\n","沒有空閑塊不能寫!"); else { uof[cltemp3].writep=disk[diskt]; diskt=disk[diskt]; printf("%s\n","寫文獻(xiàn)成功!"); } } else//打開 { if(strcmp(uof[cltemp3].fattr,"r")==0) printf("%s\n","操作不合法,不能寫!"); else { if(disk[diskt]==-1) printf("%s\n","沒有空閑塊不能寫!"); else { printf("%s%d%s\n","寫第",uof[cltemp3].writep,"塊空間!"); uof[cltemp3].writep=disk[uof[cltemp3].writep]; printf("%s\n","寫文獻(xiàn)成功!"); } } } }};voidread(charrfname[20],intrreadl){ intcltemp1=uno*S,cltemp2=(uno+1)*S,frd;while((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,rfname)!=0))cltemp1++; if(strcmp(uof[cltemp1].fname,rfname)==0) { printf("%s%d%s\n","第",uof[cltemp1].readp,"塊讀"); frd=fdph[uno*L]; while((cltemp2!=disk[frd])&&(disk[frd]!=-1))frd=disk[frd]; uof[cltemp1].readp=disk[frd]; printf("%s\n","文獻(xiàn)讀成功"); } elseprintf("%s\n","文獻(xiàn)未打開不能讀");};voidclose(charcofname[20]){ intcltemp1=uno*S,cltemp2=(uno+1)*S;while((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,cofname)!=0))cltemp1++; if(strcmp(uof[cltemp1].fname,cofname)==0) { printf("uof[cltemp1].fname=%s,cofname%s\n",uof[cltemp1].fname,cofname); cltemp2=uof[cltemp1].fstatue; printf("uof[cltemp1].fstatue=%d\n",cltemp2); switch(cltemp2) { case1:printf("%s\n","寫文獻(xiàn)結(jié)束符。");//置文獻(xiàn)結(jié)束狀態(tài) case0:strcpy(uof[cltemp1].fname,""); printf("%s\n","關(guān)閉文獻(xiàn)成功");break; default:printf("%s\n","文獻(xiàn)已關(guān)閉"); } } else printf("%s\n","文獻(xiàn)不存在!");};voiddeletef(chardfname[20]){ intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S;while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,dfname)!=0))cltemp1++; if(strcmp(ufd[cltemp1].fname,dfname)==0) { while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,dfname)!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,dfname)==0)strcpy(uof[cltemp1].fname,""); disk[diskt]=fdpt[cltemp1]; strcpy(ufd[cltemp1].fname,""); printf("%s\n","此文獻(xiàn)撤銷成功!"); } else printf("%s\n","此文獻(xiàn)已撤銷!");};voidlist(){ inttemp,temp1,fcounter=0,fucounter=0; printf("文獻(xiàn)名文獻(xiàn)屬性記錄長度文獻(xiàn)首地址\n"); for(temp=0;temp<ucounter;temp++) { fucounter=0; printf("顧客名為%s的顧客擁有的文獻(xiàn):\n",mfd[temp].uname); for(temp1=temp*L;temp1<(temp+1)*L;temp1++) { if(strcmp(ufd[temp1].fname,"")>0) { printf("%s%s%d%d\n",ufd[temp1].fname,ufd[temp1].fattr,ufd[temp1].recordl,ufd[temp1].addrf); fucounter++; fcounter++; } } printf("該顧客文獻(xiàn)總數(shù):%d\n",fucounter); } printf("系統(tǒng)擁有文獻(xiàn)總數(shù):%d\n",fcounter);};intmain(){ intmmi,temp,temp1; charfname[20],cfattr[10],ooptype[10],chtemp[10]; intrecordl,rreadl; intchlen; charmun[20],inst[10],insts[10],instta[8][10]; strcpy(instta[0],"create"); strcpy(instta[1],"open"); strcpy(instta[2],"write"); strcpy(instta[3],"read"); strcpy(instta[4],"close"); strcpy(instta[5],"deletef"); strcpy(instta[6],"list"); strcpy(instta[7],"end"); printf("\n"); for(temp=0;temp<N;temp++) { strcpy(mfd[temp].uname,""); mfd[temp].uaddr=0; }for(temp=0;temp<N*L;temp++){ strcpy(ufd[temp].fname,""); strcpy(ufd[temp].fattr,""); ufd[temp].addrf=0; ufd[temp].recordl=0;} for(temp=0;temp<N*S;temp++) { strcpy(uof[temp].fname,""); strcpy(uof[temp].fattr,""); uof[temp].fstatue=0; uof[temp].readp=0; uof[temp].recordl=0; uof[temp].writep=0; } printf("請輸入顧客總數(shù):"); scanf("%d",&ucounter); printf("請輸入文獻(xiàn)目錄表(顧客名和顧客首地址),輸入e/E0為結(jié)束。\n"); for(temp=0;temp<ucounter;temp++) { scanf("%s%d",chtemp,&(mfd[temp].uaddr)); if(((chtemp,"e")==0)||(strcmp(chtemp,"E")==0))break; strcpy(mfd[temp].uname,chtemp); } ucounter=temp; printf("輸入文獻(xiàn)目錄表結(jié)束。\n"); for(temp1=0;temp1<ucounter;temp1++) { printf("請輸入第%d個顧客的目錄表。\n",temp1+1); printf("請輸入顧客目錄表(文獻(xiàn)名文獻(xiàn)屬性(r/w)文獻(xiàn)記錄長度文獻(xiàn)首地址,輸入e/Ee00為結(jié)束。\n"); for(temp=temp1*L;temp<(temp1+1)*L;temp++) { scanf("%s%s%d%d",chtemp,ufd[temp].fattr,&(ufd[temp].recordl),&(ufd[temp].addrf)); if((strcmp(chtemp,"e")==0)||(chtemp,"E")==0)break; strcpy(ufd[temp].fname,chtemp);// printf("%s,%s,%d,%d\n",ufd[temp].fname,ufd[temp].fattr,ufd[temp].recordl,ufd[temp].addrf); } } printf("顧客目錄表輸入結(jié)束。"); for(temp1=0;temp1<ucounter;temp1++) { printf("請輸入第%d個顧客的已開文獻(xiàn)表。\n",temp1+1); printf("%s\n","請輸入顧客已開文獻(xiàn)表,e/Ee0000為結(jié)束。\n文獻(xiàn)名文獻(xiàn)屬性(r/w)文獻(xiàn)記錄長度文獻(xiàn)狀態(tài)(0/1),文獻(xiàn)讀文獻(xiàn)寫\n"); for(temp=temp1*S;temp<(temp1+1)*S;temp++) { scanf("%s%s%d%d%d%d",chtemp,uof[temp].fattr,&(uof[temp].recordl),&(uof[temp].fstatue),&(uof[temp].readp),&(uof[temp].writep)); if((strcmp(chtemp,"e")==0)||(strcmp(chtemp,"E")==0))break; strcpy(uof[temp].fname,chtemp); // printf("%s,%s,%d,%d,%d,%d\n",uof[temp].fname,uof[temp].fattr,uof[temp].recordl,uof[temp].fstatue,uof[temp].readp,uof[temp].writep); } } printf("%s\n","輸入顧客已開文獻(xiàn)表結(jié)束。"); diskh=0; diskt=399; while(1) { printf("%s\n","請輸入顧客名"); scanf("%s",mun); uno=0; while((uno<ucounter)&&(strcmp(mfd[uno].uname,mun)!=0))uno++;// printf("uno=%d\n",uno); if(uno!=ucounter) { printf("%s\n","請輸入命令:"); scanf("%s",inst);// printf("%s\n",inst);// printf("!\n"); mi=0; chlen=strlen(inst); while((inst[mi]!='(')&&(mi<chlen)){insts[mi]=inst[mi];mi++;} insts[mi]='\0';// printf("!!\n");// printf("%s\n",insts); mmi=0; while((mmi<=7)&&(strcmp(instta[mmi],insts)!=0))mmi++;// printf("%d\n",mmi); switch(mmi) { case0:ni=0;mi++; while(inst[mi]!=',') {fname[ni]=inst[mi];mi++;ni++;}; mi++; fname[ni]='\0'; ni=0; recordl=0; while(inst[mi]!=',') {recordl=recordl*10+(inst[mi]-48);mi++;ni++;} mi++;ni=0; while(inst[mi]!=')') {cfattr[ni]=inst[mi];mi++;ni++;} mi++;cfattr[ni]='\0'; printf("%s,%d,%s\n",fname,recordl,cfattr); create(fname,recordl,cfattr);break; case1:ni=0;mi++; while(inst[mi]!=',') {fname[ni]=inst[mi];mi++;ni++;}; mi++; fname[ni]='\0'; ni=0; while(inst[mi]!=')') {ooptype[ni]=ins

溫馨提示

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

最新文檔

評論

0/150

提交評論