![操作系統(tǒng)模擬UNIX文件系統(tǒng)的設計及實現(xiàn)_第1頁](http://file4.renrendoc.com/view11/M01/1F/32/wKhkGWV4T4qACzqdAAEAz7OitoM792.jpg)
![操作系統(tǒng)模擬UNIX文件系統(tǒng)的設計及實現(xiàn)_第2頁](http://file4.renrendoc.com/view11/M01/1F/32/wKhkGWV4T4qACzqdAAEAz7OitoM7922.jpg)
![操作系統(tǒng)模擬UNIX文件系統(tǒng)的設計及實現(xiàn)_第3頁](http://file4.renrendoc.com/view11/M01/1F/32/wKhkGWV4T4qACzqdAAEAz7OitoM7923.jpg)
![操作系統(tǒng)模擬UNIX文件系統(tǒng)的設計及實現(xiàn)_第4頁](http://file4.renrendoc.com/view11/M01/1F/32/wKhkGWV4T4qACzqdAAEAz7OitoM7924.jpg)
![操作系統(tǒng)模擬UNIX文件系統(tǒng)的設計及實現(xiàn)_第5頁](http://file4.renrendoc.com/view11/M01/1F/32/wKhkGWV4T4qACzqdAAEAz7OitoM7925.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
/33}//功能:分析用戶命令,將分析結果填充argc和argv//結果:0-13為系統(tǒng)命令,14為命令錯誤intanalyse(char*str){inti;chartemp[20];char*ptr_char;"write","logout","write","logout",argc=0;for(i=0,ptr_char=str;*ptr_char!='\0';ptr_char++){if(*ptr_char!=''){while(*ptr_char!=''&&(*ptr_char!='\0'))temp[i++]=*ptr_char++;argv[argc]=(char*)malloc(i+1);strncpy(argv[argc],temp,i);argv[argc][i]='\0';argc++;i=0;if(*ptr_char=='\0')break;}}if(argc!=0){for(i=0;(i<14)&&strcmp(argv[0],syscmd[i]);i++);returni;}elsereturn14;}//功能:將num號i節(jié)點保存到hd.datvoidsave_inode(intnum){if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topen\n",image_name);exit(-1);}fseek(fp,BLKNUM+num*sizeof(Inode),SEEK_SET);fwrite(&inode_array[num],sizeof(Inode),1,fp);fclose(fp);}//功能:申請一個數(shù)據(jù)塊intget_blknum(void){inti;for(i=0;i<BLKNUM;i++)if(bitmap[i]=='0')break;//未找到空閑數(shù)據(jù)塊if(i==BLKNUM){printf("Dataareaisfull.\n");exit(-1);}bitmap[i]='1';if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topen\n",image_name);exit(-1);}fseek(fp,i,SEEK_SET);fputc('1',fp);fclose(fp);returni;}//功能:將i節(jié)點號為num的文件讀入tempvoidread_blk(intnum){inti,len;charch;intadd0,add1;len=inode_array[num].length;add0=inode_array[num].address[0];if(len>512)add1=inode_array[num].address[1];if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topen.\n",image_name);exit(-1);}+add0*BLKSIZE,fseek(fp,BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE,SEEK_SET);ch=fgetc(fp);for(i=0;(i<len)&&(ch!='\0')&&(i<512);i++){temp[i]=ch;ch=fgetc(fp);}if(i>=512){fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET);ch=fgetc(fp);for(;(i<len)&&(ch!='\0');i++){temp[i]=ch;ch=fgetc(fp);}}temp[i]='\0';fclose(fp);}//功能:將temp的內(nèi)容輸入hd的數(shù)據(jù)區(qū)voidwrite_blk(intnum){inti,len;intadd0,add1;add0=inode_array[num].address[0];len=inode_array[num].length;if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topen.\n",image_name);exit(-1);}fseek(fp,BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE,SEEK_SET);for(i=0;(i<len)&&(temp[i]!='\0')&&(i<512);i++)fputc(temp[i],fp);if(i==512){add1=inode_array[num].address[1];fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET);for(;(i<len)&&(temp[i]!='\0');i++)fputc(temp[i],fp);}fputc('\0',fp);fclose(fp);//功能:釋放文件塊號為num的文件占用的空間voidrelease_blk(intnum){FILE*fp;if((fp=fopen(image_name,"r+b"))==NULL){printf("Can'topen\n",image_name);exit(-1);}bitmap[num]='0';fseek(fp,num,SEEK_SET);fputc('0',fp);fclose(fp);}//功能:顯示幫助命令voidhelp(void){printf("command:\n\helpshowhelpmenu\n\clearclearthescreen\n\cdchangedirectory\n\mkdirmakedirectory\n\createcreateanewfile\n\openopenaexistfile\n\readreadafile\n\writewritesomethingtoafile\n\closecloseafile\n\deletdeleteaexistdirectory\n\formatformataexist\n\logoutexituser\n\quitexitthissystem\n");//設置文件路徑voidpathset(){charpath[50];intm,n;if(inode_array[inum_cur].inum==0)strcpy(path,user.user_name);else{strcpy(path,user.user_name);m=0;n=inum_cur;while(m!=inum_cur){while(inode_array[n].iparent!=m){n=inode_array[n].iparent;}strcat(path,"/");strcat(path,inode_array[n].);m=n;n=inum_cur;}}printf("[%s]$",path);}//功能:切換目錄(cd..或者cddirl)voidcd(void){inti;if(argc!=2){printf("Commandcdmusthavetwoargs.\n");return;}if(!strcmp(argv[1],".."))inum_cur=inode_array[inum_cur].iparent;else{for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='d')&&(inode_array[i].iparent==inum_cur)&&!strcmp(inode_array[i].[1])&&!strcmp(inode_array[i].user_name,user.user_name))break;if(i==INODENUM)printf("Thisdirectoryisn'texsited.\n");elseinum_cur=i;}}//功能:顯示當前目錄下的子目錄和文件(dir)voiddir(void){
inti;intdcount=0,fcount=0;shortbcount=0;if(argc!=1){printf("Commanddirmusthaveoneargs.\n");return;}//遍歷i節(jié)點數(shù)組,顯示當前目錄下的子目錄和文件名for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].iparent==inum_cur)&&!strcmp(inode_array[i].user_name,user.user_name))if(inode_array[i].type=='d'){dcount++;printf("%-20s<DIR>\n",inode_array[i].);elsefcount++;bcount+=inode_array[i].length;printf("%-20s%12dbytes\n",inode_array[i].[i].length);printf("\nprintf("%ddir(s)%11dbytesprintf("\nprintf("%ddir(s)%11dbytesFreeSpace\n",dcount,1024*1024-bcount);}//功能:在當前目錄下創(chuàng)建子目錄(mkdirdir1)voidmkdir(void){inti;if(argc!=2){printf("commandmkdirmusthavetwoargs.\n");return;}//遍歷i節(jié)點數(shù)組,查找未用的i節(jié)點for(i=0;i<INODENUM;i++)if(inode_array[i].inum<0)break;if(i==INODENUM){printf("Inodeisfull.\n");exit(-1);}inode_array[i].inum=i;strcpy(inode_array[i].,argv[1]);inode_array[i].type='d';strcpy(inode_array[i].user_name,user.user_name);inode_array[i].iparent=inum_cur;inode_array[i].length=0;save_inode(i);}//功能:在當前目錄下創(chuàng)建文件(creatfile)voidcreate(void){inti;if(argc!=2){printf("commandcreatmusthavetwoargs.\n");return;}for(i=0;i<INODENUM;i++){if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&&!strcmp(inode_array[i].,argv[1])){printf("Thisexsit.\n");return;}}for(i=0;i<INODENUM;i++)if(inode_array[i].inum<0)break;if(i==INODENUM){printf("Inodeisfull.\n");exit(-1);}inode_array[i].inum=i;strcpy(inode_array[i].,argv[1]);inode_array[i].type='f';strcpy(inode_array[i].user_name,user.user_name);inode_array[i].iparent=inum_cur;inode_array[i].length=0;save_inode(i);}//功能:打開當前目錄下的文件(openfile1)voidopen(){inti,inum,mode,;if(argc!=2){printf("commandopenmusthavetwoargs.\n");return;}for(i=0;i<INODENUM;i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&&
!strcmp(inode_array[i].[1])&&!strcmp(inode_array[i].user_name,user.user_name))break;if(i==INODENUM){printf("Thewanttoopendoesn'texsited.\n");return;}inum=i;printf("Pleaseinputopenmode:(1:read,2:write,3:readandwrite):");scanf("%d",&mode);getchar();if((mode<1)||(mode>3)){printf("Openmodeiswrong.\n");return;}for(i=0;i<;i++)if([i].inum<0)break;if(i==){printf("Theisfull,pleaseclosesomefile.\n");return;}=i;[].inum=inum;strcpy([].,inode_array[inum].);[].mode=mode;printf("Openby",[].);if(mode==1)printf("readonly.\n");elseif(mode==2)printf("writeonly.\n");elseprintf("readandwrite.\n");}//功能:從文件中讀出字符(readfile1)voidread(){inti,inum;if(argc!=2){printf("commandreadmusthavetwoargs.\n");return;}for(i=0;i<;i++)if(([i].inum>0)&&!strcmp([i].[1]))break;if(i==){printf("Open%sfirst.\n",argv[1]);return;}elseif([i].mode==2){printf("Can'tread%s.\n",argv[1]);return;}inum=[i].inum;printf("Thelengthof%s:%d.\n",argv[1],inode_array[inum].length);if(inode_array[inum].length>0){read_blk(inum);for(i=0;(i<inode_array[inum].length)&&(temp[i]!='\0');i++)printf("%c",temp[i]);}}//功能:向文件中寫入字符(writefile1)voidwrite(){inti,inum,length;if(argc!=2){printf("Commandwritemusthavetwoargs.\n");return;for(i=0;i<;i++)if(([i].inum>0)&&!strcmp([i].[1]))break;if(i==){printf("Open%sfirst.\n",argv[1]);return;}elseif([i].mode==1){printf("Can'twrite%s.\n",argv[1]);return;}inum=[i].inum;printf("Thelengthof%s:%d\n",inode_array[inum].,inode_array[inum].length);if(inode_array[inum].length==0){i=0;inode_array[inum].address[0]=get_blknum();printf("Inputthedata(CTRL+Ztoend):\n");while(i<1023&&(temp[i]=getchar())!=EOF)i++;temp[i]='\0';length=strlen(temp)+1;inode_array[inum].length=length;if(length>512)inode_array[inum].address[1]=get_blknum();save_inode(inum);write_blk(inum);}elseprintf("This'tbewritten.\n");}//功能:關閉已經(jīng)打開的文件(closefile1)voidclose(void){inti;if(argc!=2){printf("Commandclosemusthavetwoargs.\n");return;}for(i=0;i<;i++)if(([i].inum>0)&&!strcmp([i].,argv[1]))break;if(i==){printf("This'tbeopened.\n");return;}else{[i].inum=-1;printf("Close%ssuccess!\n",argv[1]);}}//回收i節(jié)點,有文件則刪除文件voiddel(inti){inode_array[i].inum=-1;if(inode_array[i].length>0){release_blk(inode_array[i].address[0]);if(inode_array[i].length>=512)release_blk(inode_array[i].address[1]);}save_inode(i);}//刪除子目錄樹和文件voiddelet(void){if(argc!=2){printf("Commanddeletemusthavetwoargs.\n");return;}intn,t,i;stack<int>istk;for(i=0;i<INODENUM;i++)//查找待刪除子目錄if((inode_array[i].inum>=0)&&(inode_array[i].iparent==inum_cur)&&(!strcmp(inode_array[i].[1]))&&(!strcmp(inode_array[i].user_name,user.user_name))){n=inode_array[i].inum;break;if(i==INODENUM)puts("DirectoryERROR");else{istk.push(n);while(!istk.empty()){t=istk.top();istk.pop();del(t);for(i=0;i<INODENUM;i++)if((inode_array[i].inum>=0)&&(inode_array[i].iparent==t))istk.push(i);}}}//功能:退出當前用戶(logout)voidlogout(){printf("Doyouwanttoexitthisuser(y/n)?");scanf("%c",&choice);getchar();if((choice=='y')||(choice=='Y')){printf("\nCurrentuserhasexited!\n");login();}return;}//功能:退出文件系統(tǒng)(quit)voidquit(){print
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同模板學校食堂承包經(jīng)營合同范本
- Unit2 He's cool(說課稿)2023-2024學年外研版(三起)四年級下冊
- 2025合同模板工程的變更范本
- 2025江蘇:安全責任寫進集體合同模板范本
- Unit1 School(說課稿)-2024-2025人教版(新起點)英語一年級上冊
- 2023七年級語文上冊 第四單元 綜合性學習 少年正是讀書時說課稿 新人教版
- Unit5 I'm cleaning my room(說課稿)-2023-2024學年人教精通版英語五年級下冊001
- 2024年九年級語文下冊 第二單元 第5課 孔乙己說課稿 新人教版
- 2024-2025學年高中化學下學期第20周 常見氣體的制備說課稿
- Unit 1 people of achievement Reading for writing 說課稿-2024-2025學年高中英語人教版(2019)選擇性必修第一冊
- 進模模具設計
- 完整,滬教版小學四年級英語上冊單詞表
- 2021年高考化學真題和模擬題分類匯編專題20工業(yè)流程題含解析
- 2023年北京市高考作文評分標準及優(yōu)秀、滿分作文
- 2023年大唐尿素投標文件
- 《鋼鐵是怎樣煉成的》名著閱讀(精講課件) 初中語文名著導讀
- 縮窄性心包炎課件
- 《工程電磁場》配套教學課件
- 職位管理手冊
- 東南大學 固體物理課件
- 行政人事助理崗位月度KPI績效考核表
評論
0/150
提交評論