操作系统报告四.docx
- 文档编号:30039344
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:51.35KB
操作系统报告四.docx
《操作系统报告四.docx》由会员分享,可在线阅读,更多相关《操作系统报告四.docx(18页珍藏版)》请在冰豆网上搜索。
操作系统报告四
实验4文件操作的模拟实验
一、实验目的
1.了解文件系统的原理;
2.用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验准备
1.文件的逻辑结构
●顺序文件
●索引文件
●索引顺序文件
●直接文件和哈希文件
2.外存分配方式
●连续分配
●链接分配
●索引分配
三、实验内容
1.实验要求
要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
2.实验题目
●设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
●程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
●为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
3.算法与框图
因系统小,文件目录的检索使用了简单的线性搜索。
文件保护简单使用了三位保护码:
允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
程序中使用的主要设计结构如下:
主文件目录和用户文件目录(MFD、UFD)打开文件目录(AFD)(即运行文件目录)。
MDF
用户名
文件目录指针
用户名
文件目录指针
UFD
文件名
保护码
文件长度
文件名
AFD
打开文件名
打开保护码
读写指针
四、相关代码
#include
#include
#defineSizeOfUserName255
#defineSizeOfUser10
#defineSizeOfFile10
#defineSizeOfCommand255
#defineSizeOfFileName255
charUserName[SizeOfUser][SizeOfUserName];
longUser;
structInfoOfFile
{
charName[SizeOfFileName];
boolsafe[3];//Read,Write,Execute
longstatus;//ready,open;
}UFD[SizeOfUser][SizeOfFile];
longnum[SizeOfUser];
longnum_open[SizeOfUser];
charz[4]="rwe";
voidls()//列文件目录
{
chartmp[100];longi,j;
printf("%20s%20s%20s\n","Name","Property","Status");
for(i=0;i { printf("%20s",UFD[User][i].Name); for(j=0;j<3;j++) { if(UFD[User][i].safe[j]) { tmp[j]=z[j]; } else { tmp[j]='-'; } } tmp[3]='\0'; printf("%20s",tmp); if(UFD[User][i].status) { printf("%20s\n","Opened"); } else { printf("%20s\n","Ready"); } } printf("%ldfile(s)intotal\n",num[User]); } longlogin()//切换用户 { longi; charNameInput[SizeOfUserName]; do { printf("PleaseinputyourID: "); scanf("%s",NameInput); i=0; while(i =0){ i++; } if(strcmp(NameInput,UserName[i])! =0) { printf("BadUserID.\n"); } }while(strcmp(NameInput,UserName[i])! =0); returni; } voidinit()//初始化 { longi,j,k; chartmp[4]; memset(num_open,0,sizeof(num_open)); //读入用户名列表 freopen("record.txt","r",stdin); for(i=0;i { scanf("%s",UserName[i]); } //读入文件列表 for(i=0;i { scanf("%ld",&num[i]); for(j=0;j { scanf("%s%s",UFD[i][j].Name,tmp); for(k=0;k<3;k++) { if(tmp[k]=='-') { UFD[i][j].safe[k]=0; } else { UFD[i][j].safe[k]=1; }} UFD[i][j].status=0; } } freopen("con","r",stdin); User=login(); ls(); } voidcreate()//创建文件 { longi; charfilename[SizeOfFileName]; charprop[128]; if(num[User]==SizeOfFile)//保存已满 { printf("Failed...Youcanonlysave%ldfiles\n",SizeOfFile); return; } printf("Inputfilenameandproperty>"); scanf("%s%s",filename,prop); for(i=0;i { if(strcmp(filename,UFD[User][i].Name)==0)//重名 { printf("Failed...File%salreadyexists\n",filename); return; } } strcpy(UFD[User][num[User]].Name,filename); for(i=0;i<3;i++)//设置属性 { if(prop[i]=='-') { UFD[User][num[User]].safe[i]=0; } else { UFD[User][num[User]].safe[i]=1; } }UFD[User][num[User]].status=0; ++num[User]; printf("Success! \n"); } voidopen()//打开文件 { longi; charfilename[SizeOfFileName]; if(num_open[User]==5) { printf("Failed...Youhavealreadyopened5files\n"); //打开文件数已到上限 return; } printf("Inputfilename>"); scanf("%s",filename); for(i=0;i { if(strcmp(filename,UFD[User][i].Name)==0) { if(UFD[User][i].status==0)//文件未占用 { UFD[User][i].status=1; num_open[User]++; printf("Success! \n"); } else//已被打开 { printf("Failed...File%sisalreadyopened\n",filename); } return; } } printf("Failed...Nosuchfile\n");//找不到文件 } voidclose()//关闭文件 { longi; charfilename[SizeOfFileName]; printf("Inputfilename>");scanf("%s",filename); for(i=0;i { if(strcmp(filename,UFD[User][i].Name)==0) { if(UFD[User][i].status==1)//成功 { UFD[User][i].status=0; num_open[User]--; printf("Success! \n"); } else//文件并未打开 { printf("Failed...File%sisnotopened\n",filename); } return; } } printf("Failed...Nosuchfile\n");//找不到文件 } voidread()//读文件 { longi; charfilename[SizeOfFileName]; printf("Inputfilename>"); scanf("%s",filename); for(i=0;i { if(strcmp(filename,UFD[User][i].Name)==0) { if(UFD[User][i].safe[0]==0)//属性设置为不可读 { printf("Failed...File%sisnotreadable\n",filename); return; } if(UFD[User][i].status==1)//文件已打开 { printf("Failed...File%sisalreadyopened\n",filename); return; } printf("Success! \n");//成功 return;} } printf("Failed...Nosuchfile\n");//找不到文件 } voidwrite()//写文件 { longi; charfilename[SizeOfFileName]; printf("Inputfilename>"); scanf("%s",filename); for(i=0;i { if(strcmp(filename,UFD[User][i].Name)==0) { if(UFD[User][i].safe[1]==0)//属性设置为不可写 { printf("Failed...File%sisnotwritable\n",filename); return; } if(UFD[User][i].status==1)//已打开 { printf("Failed...File%sisalreadyopened\n",filename); return; } printf("Success! \n");//成功 return; } } printf("Failed...Nosuchfile\n");//找不到文件 } voidmydelete()//删除文件 { longi,j; charfilename[SizeOfFileName]; printf("Inputfilename>"); scanf("%s",filename); for(i=0;i {if(strcmp(filename,UFD[User][i].Name)==0) { if(UFD[User][i].status==1)//文件正被打开 { printf("Failed...File%sisalreadyopened\n",filename); return; } num[User]--; for(j=i;j { UFD[User][j]=UFD[User][j+1]; } printf("Success! \n");//成功 return; } } printf("Failed...Nosuchfile\n");//找不到文件 } voidsave()//保存本次信息 { FILE*fp=fopen("record.txt","w"); longi,j,k; chartt[4]="rwe"; chartmp[4]; //保存用户列表 for(i=0;i { fprintf(fp,"%s\n",UserName[i]); } //保存文件列表 for(i=0;i { fprintf(fp,"%ld\n",num[i]); for(j=0;j { for(k=0;k<3;k++) { if(UFD[i][j].safe[k]) {tmp[k]=tt[k]; } else { tmp[k]='-'; } } tmp[3]=0; fprintf(fp,"%s%s\n",UFD[i][j].Name,tmp); } } printf("Success! \n");//成功 fclose(fp); } voidwork()//交互主函数 { boolover=0; charcommand[SizeOfCommand]; while(! over) { printf("%s>",UserName[User]); scanf("%s",command); if(strcmp(command,"login")==0) { User=login(); ls(); continue; } if(strcmp(command,"bye")==0) { printf("Byebye.\n"); over=1; continue; } if(strcmp(command,"ls")==0||strcmp(command,"dir")==0) { ls(); continue; } if(strcmp(command,"create")==0) { create();continue; } if(strcmp(command,"delete")==0) { mydelete(); continue; } if(strcmp(command,"open")==0) { open(); continue; } if(strcmp(command,"close")==0) { close(); continue; } if(strcmp(command,"read")==0) { read(); continue; } if(strcmp(command,"write")==0) { write(); continue; } if(strcmp(command,"save")==0) { save(); continue; } printf("Badcommand.\n"); } } intmain() { init(); work(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 报告