操作系统课程设计报告.docx
- 文档编号:23897837
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:37
- 大小:122.10KB
操作系统课程设计报告.docx
《操作系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告.docx(37页珍藏版)》请在冰豆网上搜索。
操作系统课程设计报告
援作系俛礫程筱针报告
专业:
学号:
姓名:
提交日期:
【设计目的】
(1)本实验的目的是通过一个简单多用户文件系统的设汁,加深理解文件系统的部功能和部实现。
(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力
【设计容】
为Linux系统设计一个简单的二级文件系统*要求做到以下几点:
1•可以实现下列几条命令:
login
用户登录
dir
列目录
create
创建文件
delete
删除文件
open
打开文件
close
关闭文件
read
读文件
write
写文件
cd
进出目录
2.列目录时要列出文件名,物理地址,保护码和文件长度
3.源文件可以进行读写保护
【实验环境】
C++/VC++
【源程序清单】
includeustdio.hH
#includc,rstring.h°
#includcuconio.hH
#includcwstdlib.hv
#defineMAXNAME25/*thelargestlengthofmfdname.ufdnamejilename*/
#defineMAXCHILD50/*thelargestchild*/
#dcfineMAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/
typcdcfstnict/*thestructureofOSFILE*/
{
intfpaddr:
/*filephysicaladdress*/
intflength;/*filelength*/
intfmode;/*filemode:
0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/charfname[MAXNAME]:
/*filename*/
}OSFILE:
typedcfstnict/*thestructureofOSUFD*/
{
charufdname[MAXNAME];/*ufdname*/
OSHLEufdfile[MAXCHILD]:
/*ufdownfile*/
JOSUFD;
typcdefstnict/*thestructureofOSUFD'LOGIN*/
{
charufdnamefMAXNAME];/*ufdname*/
charufdpword[8];/*ufdpassword*/
}OSUFD_LOGIN:
typcdefstnict八fileopenmode*/
{
intifopen;/*ifopen:
0-close,1-open*/
intopenmode;/*0-readonlyj-writeonly,2-readandwriteJ-initial*/
}OSUFD_OPENMODE
OSUFD*ufd[MAXCHILD];/*ufdandufdownfiles*/
OSUFD_LOGINufdjp;
intucount=0;/*thecountofmfd'sufds*/
intfcount(MAXCHILD):
/*thecountofufd'sfiles*/
intloginsuc=0;/^whetherloginsuccessfully*/
charusername[MAXNAME]:
/^recordloginuser'sname22*/
chardirname[MAXNAME];/*recordcurrentdirectory*/
intfpaddmo[MAX];/^recordfilephysicaladdressnum*/
OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILDl;/^recordfileopen/close*/intwgetchar;/^whethergetchar()*/
FILE*fp_nifd.*fp_ufd.*fp_file_p,*fp_file;
voidLoginFO;/*LOGINFileSystem*/
voidDirF();/*DirFileSystem*/
voidCdF();/《ChangeDir*/
voidCreateFO;/^CreateFile*/
voidDeleteFO;/*DeleteFile*/
voidModifyFMO;/*ModifyFileMode*/
voidOpenF();/*OpenFile*/
voidCloseF();/*CloseFile*/
voidReadF();/*ReadFile*/
voidWriteF();/’WriteFile*/
voidQuitF();/*QuitFileSystem*/
voidhelp();
char*rtrim(char*str);/^removethetrailingblanks.*/
char*ltrim(char*str);/^removetheheadingblanks.*/
voidInputPW(char^password);/*inputpassword,use*replace*/
voidSelPANo(intRorW);/*Setphysicaladdressnum*/
intExistD(char*dimame);/^WhetherDirNameExist,Exist-i,NotExist-O*/intWriteFlO;/*writefile*/
intExistF(char'filename);/^WhetherFileNamcExist,Exist-i,NotExist-O*/intFindPANo();/*findoutphysicaladdressnum*/voidclrscr()
{
system(vclsv);
}
intmain()
{
inti,choicel;
charchoice[50]:
/^choiceoperation:
dirxreate.delete,open.delete,modifyjead,write*/intchoiceend=1;/*whetherchoiceend*/
char*rtrim(char*str);/^removethetrailingblanks.*/char*ltrim(char*str);/宅removetheheadingblanks.*/
if((fp_mfd=fopen(nc:
\\osfile\\nifd.txt,\HrbH))==NULL)
{
fp_mfd=fopen(nc:
\\osfile\\mfd.txt^,\vbH);fclose(fp_mfd);
}
for(i=0;i //textattr(BLACK*16IWHITE); clrscr();/*clearscreen*/ LoginFO;/*userlogin*/ clrscr(); if(loginsuc==l)/*LoginSuccessfully*/ { while (1) { wgetchar=O: if(choiceend=l) printf(M\n\nC: \\%s>H,stnipr(dirnamc)); else printf(MBadcommandorfilenanie.\nC: \\%s>H,strupr(username));gets(choice);//输入所选择的 strcpy(choicejtrim(rtrini(strlwr(choice))));〃将输入的值赋给choice if(strcmp(choice/diru)=0)choice1=1;〃依次将输入的值与 dir,create等进行比较 elseif(strcmp(choice/,createH)==0)choice1=2;〃如果输入create将choice1置为2通过switch选择,以下依次类推 elseif(strcmp(choice/,delete,,)==0)choice1=3; elseif(strcmp(choice/,attribM)==0)choice1=4: elseif(strcmp(choice/,openM)==0)choice1=5; elseif(strcmp(choice/,closen)==0)choice1=6; elseif(strcmp(choicc/,read,')=0)choice1=7; elseif(strcmp(choicc/,writeM)=0)choice1=8; elseif(strcmp(choice,HexitM)==0)choice1=9; elseif(strcmp(choice/,cls,,)==0)choice1=10; elseif(strcmp(choice/,cdu)==0)choice1=11; elseif(strcmp(choice/,helpH)=0)choice1=20; elsechoice1=12;//choice1=12时跳转到default,然后继续循环 switch(choicel) { case1: DirF();choicecnd=l;break; case2: CreateF();choiceend=l;if(! wgetchar)getchar();break; case3: DcleteF();choiceend=l;if(! wgetchar)getchar();break; case4: ModifyFM();choiceend=1;if(! wgetchar)getchar();break; case5: OpenF();choiceend=1;if(! wgetchar)getchar();break; case6: CloseF();choiceend=l;if(! wgetchar)getchar();break; case7: ReadF();choiceend=l;if(! wgetchar)getchar(): break; case8: WriteF();choiceend=l;if(! wgetchar)getchar();break; case9: printf(H\nYouhaveexitedthissystem/1); QuitF();exit(O);break; case10: clrscr();choiceend=1;break: case11: CdF(): choiceend=l;break: case20: help();choiceend=1: break; default: choiceend=0; } ) } else printf(H\nAccessdenied.M);〃登录成功 } voidhelp(void) { printf(M\nTheCommandList\nH); printf(H\nCdAttribCreatewriteReadOpenCisDeleteExitClose\nu); } char*rtrim(char*str)/*除去末尾端的空格指针指向字符串第一个*/ intn=strlen(str)-l;//n为字符串长度减1 while(n>=0) { if(《tr+n)! -r)〃末尾不存在空格 { *(slr+n+l)-\O: //W表示结束符 break; } elsen-s〃如果存在空格将空格去掉 } if(n<0)str[O]=\O: returnstr; ) char*ltrim(char*str)/*除去前端的空格*/ { strrev(str);〃把字符串str的所有字符的顺序颠倒 rtrim(str);//去掉尾端空格 strrev(str);〃再颠倒过来 returnstr; } voidLoginFO/*LOGINFileSystem*/ { charloginamelMAXNAME]Joginpw[9],logincpw[9],str[50]; inti,j,flag=l; chara[25J; intfindout;/*loginusernotexist*/ while(l) { findout=0; printf(H\n\nLoginName: "); gets(loginame);〃输入字符串 返回给一个文件 〃检测输入 ltrim(rtrim(loginame));〃去掉前后端的空格fp_mfd=fopen(,,c: \\osfile\\mfd.txt,\,,rbn);//打开该文件, 指针 for(i=0;fread(&ufd」p.sizcof(OSUFD_LOGIN),l・fp_mfd)! =0;i++) 〃若已经注册过 登录名和mfd.txt是否一样 if(strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0) findout=l;//表示该用户已注册过 strcpy(logincpw,ufd」p.ufdpword); } fclose(fp_mfd); if(findout==1)/*userexist*/ { printf(HLoginPassword: 1*); InputPW(loginpw);/*inputpassword,use*replace*/ if(strcmp(loginpwJogincpw)==0) ( strcpy(username,strupr(loginame));strcpy(dirname.useniame);fp_mfd=fopen(,,c: \\osfile\\mfd.txt,\nrbH); for(j=0;fread(&ufd」p.sizcof(OSUFD_LOGIN),1.fp_mfd)! =O;j++){ strcpy(str,,rc: \\osfile\\H); strcat(strjifdjp.ufdnanie); strcat(str;'.txtH); ufd[j]=(OSUFD*)malloc⑸zcof(OSUFD)); strcpy(ufd|j]->ufdnamc.stnipr(ufd」p・ufdnamc));fp_ufd=fopen(str/rbH); fcount[j]=0; for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE)J,fp_ufd)! =0;i++,fcount[j]++){ ifopen(j][i].ifopen=0; ifopenopenmode=4; } fclose(fp_ufd); } fclose(fp_mfd); ucount=j; SetPANo(O); printf("\n\nLoginsuccessful! WelcometothisFileSystem\n\nH);loginsuc=l; return; } else { printf(M\n\nu); flag=l; while(flag) printf(HLoginFailed! PasswordError.TryAgain(Y/N): r);gets(a); ltrim(rtrim(a)); if(strcmp(strupr(a)/'YH)=O) ( loginsuc=0; flag=0; } elseif(strcmp(strupr(a);,N,,)==O) { loginsuc=0; flag=0; return; } } } else printf(MNewPassword(<=8): M); InputPW(Ioginpw);/*inputnewpassword.use***replace*/ printf(恤ConfirmPassword(<=8): M);/*inputnewpassword.use*replace*/InputPW(logincpw); if(strcmp(loginpwjogincpw)==0) { strcpy(ufd」p・ufdnamc,sirupr(loginamc)); strcpy(ufd」p.ufdpword」oginpw);fp_mfd=fopen(Hc: \\osfile\\mfd.txt,\HabH); fwrite(&ufd」p.sizcof(OSUFD_LOGIN),1Jp_mfd);fclose(fp_mfd); strcpy(usernanie,strupr(loginame));strcpy(dirnameJoginame); //////////////////////////////////////////////////////// strcpy(str/'c: \\osfileW); strcat(str.username); strcaKstr/Uxt"); if((fp_ufd=fopcn(str/rbH))==NULL) { fp_ufd=fopen(str/wbM);fclose(fp_ufd); } fp_nifd=fopen(nc: \\osfile\\mfd.txt,\,,rbH); for(j=0;fread(&ufd」p.sizcof(OSUFD_LOGIN)丄fp_mfd)! =O;j++){ strcpy(str/tc: \\osfile\\H); strcat(strjifdjp.ufdnanie); strcat(str;\txtH); ufd[j]=(OSUFD*)malIoc(sizeof(OSUFD));strcpy(ufd|j]->ufdnamc.stnipr(ufdJp.ufdnamc));fp_ufd=fopen(str/rbM); for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE)J,fp_ufd)! =0;i++,fcount[j]++) { ifopen(j][i].ifopen=0; ifopen[j][i].opcnmode=4; } fclose(fp_ufd); } fclose(fp_mfd); ucount=j; SetPANo(O); printf(H\n\nLoginSuccessful! WelcometothisSystem\ii\nM);loginsuc=l; return; } else { printf(M\n\nu); flag=l; while(flag) { printf(HLoginFailed! PasswordError.TryAgain(Y/N): u);gets(a); Itrim(rtrini(a)); if(strcmp(strupr(a)/,Y,,)=O) { loginsuc=0; flag=0; } elseif(strcmp(strupr(a),HNH)==O) loginsuc=0;flag=0;return; voidSetPANo(intRorW)/*Setphysicaladdressnuni,O-readJ-write*/ { intij; if(RorW==0) { if((fpJile_p=fopen(Nc: \\osfile\\file\\file_p4xt\,7bM))==NULL)〃如果文件未读成功 {fp_filc_p=fopcnC'c: \\osfilc\\filc\\filc_p・gTwb”);〃创建该文件 fclosc(fp_filc_p); } fp_file_p=fopen(Hc: \\osfile\\fiIe\\file_p.txt,,/,rbH); /////////////////////////////////////////////////////////////////// for(i=0;fread(&j,sizeof(int),1Jp_file_p)! =O;i++)fpaddrno[j]=l;〃真正模拟的位示图 的关系 /*for(i=1;i if((i%13)=0) fpaddrno[i]=l;*/ } else { fp_filc_p=fopcn化: \\osfilc\\filc\\filc_p」xCwb”); /*for(i=1;i 13)=0) fpaddmo[i]=0;*/ for(i=0;i if(fpaddmo[i]=l)〃表示已使用 fwrite(&i,sizeof(int),1,fp_file_p);〃把第几个扇区号写进文 件 } fclose(fp_file_p); voidInputPW(char^password)/*inputpassword.use***replace*/ intj; for(j=0;j<=7;j++) { password[j]=getch(); if((int)(password[j])! =13) { if((int)(password[j])! =8)putcharC1**); else ( 〃密码的长度小于8 //获得输入值存入数组 〃13表示ASCII码,如果不是回车 〃如果不是退格 //就输入丿个*号 〃如果是退格 〃且密码个数大于0 〃'\b‘表示退格,putchar函 putchar(Ab*);putchar(*');putchar(\b');数只能用于单个字符输出 }elsej—; } } else {password|j]=f\0,;break; //\0是字符串的结束符,如果输出完毕则终止 } } password[j]=f\0,; voidDirF()/*DirFileSystem*/ { inti,jxount=0; charsfmode[25],sfpaddr[25],str[25]; clrscr(); if(strcmp(strupr(ltrim(rtrim(dirname)))/n,)!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 报告