操作系统文件系统实验报告后附源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统文件系统实验报告后附源代码
目录
1 课程设计简介 (1)
课程设计的目的 (1)
课程设计内容 (1)
2 数据结构的设计 (2)
预定义 (2)
结构体 (2)
全局变量和函数 (2)
3 功能模块(或算法)描述 (3)
模块划分 (4)
模块流程图 (6)
4 程序运行结果 (4)
5心得体会 (5)
参考文献 (6)
附源代码 (7)
1 课程设计简介
课程设计的目的
课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
课程设计内容
课程设计内容设计一个简单的多用户文件系统。
即
①在系统中用一个文件来模拟一个磁盘;
②此系统至少有:Create、delete、open、close、read、write 等和部分文件属性的功能。
③实现这个文件系统。
④能实际演示这个文件系统。
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录(AFD)。
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4)因系统小,文件目录的检索使用了简单的线性搜索。
5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图所示。
2 数据结构的设计
预定义
#define BLOCKSIZ 512
Login 登录
结束
是,登录成功输入用户名
查找是否有改用户名输入密码是
否
密码是否正确否Inode 位图是否加锁
否,加锁Inode 空间是否已满
否
在ionde 位图顺序查找空闲的inode 找到返回inode 地址Inode 位图解锁
结束
申请失败是
找不到
Balloc(int k)申请k 个block 空间Block 位图是否加锁否,加锁是
否有k 个空闲的block 是在block 位图按照分组查找空闲的block 找到返回block 地址Block 位图解锁
结束
申请失败否
找不到
后在连续
出版物:[序号]主要责任者.文献题名[J ].刊名,出版年份,卷号(期号):起止页码)
[2] 刘国钧,王连成.图书馆史研究[M].北京:高等教育出版社,1979:15-18,
31.(专著:[序号]主要责任者.文献题名[M].出版地:出版者,出版年:起止页码.)
[3] 孙品一.高校学报编辑工作现代化特征[C].中国高等学校自然科学学报
研究会.科技编辑学论文集(2).北京:北京师范大学出版社,1998:10-22.(论文集:[序号]主要责任者.文献题名[C]∥主编.论文集名.出版地:出版者,出版年:起止页码.)
附:源代码
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#define BLOCKSIZ 512 ...............\n");
login();
showhelp();
printf("%s>",cmdhead);
while(1)
{
scanf("%s",&str);
if(strcmp(str,"exit")==0)
{
fclose(fd);
return;
}
else if(strcmp(str,"dir")==0) {
showdir();
}
else if(strcmp(str,"bit")==0) {
showbitmap();
}
else if(strcmp(str,"help")==0) {
showhelp();
}
else if(strcmp(str,"logout")==0) {
logout();
}
else if(Iscmd(str))
{
scanf("%s",&strname);
cmd_Up(str,strname);
}
else
{
printf("错误命令!\n");
}
printf("%s>",cmdhead);
}
}
s_r_blocks_count=0; /* 保留的 blocks 计数 */
filsys. s_free_blocks_count=DATABLKNUM-5; /* 空闲的 blocks 计数 */
[0]=50-5;_name, ".");
dir_buf[0].d_ino= 0;_name,"..");
dir_buf[1].d_ino= 0;_name, "etc");
dir_buf[2].d_ino = 1;_name, ".");
dir_buf[0].d_ino = 1;
strcpy(dir_buf[1].d_name, "..");
dir_buf[1].d_ino = 0;
strcpy(dir_buf[2].d_name, "passwd");
dir_buf[2].d_ino = 2;
strcpy(dir_buf[3].d_name, "admin");
dir_buf[3].d_ino = 3;
strcpy(dir_buf[4].d_name, "xiao");
dir_buf[4].d_ino = 4;
fseek(fd, DATASTART+BLOCKSIZ, SEEK_SET);
fwrite (dir_buf, BLOCKSIZ,1,fd);
_name, ".");
dir_buf[0].d_ino = 3;
strcpy(dir_buf[1].d_name, "..");
dir_buf[1].d_ino = 1;
fseek(fd, DATASTART+BLOCKSIZ*3, SEEK_SET);
fwrite (dir_buf, BLOCKSIZ,1,fd);
_name, ".");
dir_buf[0].d_ino =4;
strcpy(dir_buf[1].d_name, "..");
dir_buf[1].d_ino = 1;
fseek(fd, DATASTART+BLOCKSIZ*4, SEEK_SET); fwrite (dir_buf, BLOCKSIZ,1,fd);
_uid= 1;
passwd[0].p_gid = GRUP_0; sername, "admin"); strcpy(passwd[0].password, "admin"); passwd[1].p_uid= 2;
passwd[1].p_gid = GRUP_1;
strcpy(passwd[1].username, "xiao");
strcpy(passwd[1].password, "xiao");
for (i=2; i<="" p="">
{
passwd[i].p_uid = 0;
passwd[i].p_gid = GRUP_4;
strcpy(passwd[i].username, "no this user"); strcpy(passwd[i].password,"");
}
fseek(fd,DATASTART+BLOCKSIZ*2, SEEK_SET); fwrite(passwd,BLOCKSIZ,1,fd);
ininode->di_ino=2;.\n");
fd = fopen (fsystemname, "rb+");_uid!=0) {
sername,&pwd[i].password);
}
}
inodetemp=read_inode(0);t\t\t
\tinode %d\n",dir_buf[i].d_ino);
}
else if(i==1)
{
printf("\t..\t\t\t
\tinode %d\n",dir_buf[i].d_ino);
}
else
{
inodetemp=read_inode(dir_buf[i].d_ino);
if((inodetemp->di_mode&DIMODE_DIR)==DIMODE_DIR)
{
printf("\t%s\t\t\t
\tinode %d\n",dir_buf[i].d_name,dir_buf[i].d_ino);
}
else
if((inodetemp->di_mode&DIMODE_FILE)==DIMODE_FILE) {
printf("\t%s\t\t\t\tsize %d block %d\n",dir_buf[i].d_name,inodetemp->di_size,inodetemp->di_block[0]);
}
else
{
printf("\t%s\t\t\tinode %d block %d\n",dir_buf[i].d_name,dir_buf[i].d_ino,inodetemp->di_bl ock[0]);
}
}
}
}
int Enterdir(char* namestr),namestr)==0)
{
i=0;
break;
}
if(strcmp("..",namestr)==0)
{
i=1;
break;
}
if(strcmp(dir_buf[i].d_name,namestr)==0) {
if(dir_buf[i].d_ino!=-1)
{
_ino);
break;
}
}
i++;
}while(idi_number);
if(i==cur_inode->di_number)
{
_ino);
}
int Iscmd(char cmd[10])
{
del")==0)
{
if(strcmp(cmdhead,"root")!=0)
{
i=0;
while(cmdhead[i]!='\0')
{
if(cmdhead[i]=='\\')
{
itemp=i;
}
i++;
}
cmdhead[itemp]='\0';
}
}
else if(strcmp(strname,".")!=0)
{
strcat(cmdhead,"\\");
strcat(cmdhead,strname);
}
}
else
{
printf("进入目录失败!\n");
}
}
else if(strcmp(str,"create")==0)
{
if(creat(strname))
{
del_ino=inum;_name,strname);
fseek(fd,DATASTART+BLOCKSIZ*cur_inode->di_block[0], SEEK_SET);_name,".");
buf[0].d_ino= inum;_name,"..");
buf[1].d_ino= cur_inode->di_ino;
fseek(fd,DATASTART+BLOCKSIZ*bnum,
SEEK_SET);_ino=inum;_name,strname);
fseek(fd,DATASTART+BLOCKSIZ*cur_inode->di_block[0],
SEEK_SET);_name,strname)!=0)
{
i++;
}
for(;idi_number;i++)
{
strcpy(dir_buf[i].d_name,dir_buf[i+1].d_name);
dir_buf[i].d_ino=dir_buf[i+1].d_ino;
}
cur_inode->di_number--;
fseek(fd,DATASTART+BLOCKSIZ*cur_inode->di_block[0],
SEEK_SET);_name,strname)==0)
{
if(dir_buf[i].d_ino!=-1)
{
printf("已经找到 %s ,inode=%d\n",strname,dir_buf[i].d_ino);
printf("请输入新的文件名:");
fflush(stdin);
scanf("%s",temp);
if(strlen(temp)>=14)
{
printf("新文件名过长!重命名失败!\n");
return -1;
}
else
{
if(Fd_dirfile(temp)!=-1)_name,temp);
fseek(fd,DATASTART+BLOCKSIZ*cur_inode->di_block[0], SEEK_SET);sername);
if(strcmp(pwd[i].username,str)==0)
{
break;
}
if(strcmp("exit",str)==0)
{
exit(0);
}
}
if(i!=PWDNUM)
{
break;
}
}while(1);
printf("passwd:");
fflush(stdin);
scanf("%s",str);
if(strcmp(pwd[i].password,str)==0)
{
break;
}
if(strcmp("exit",str)==0)
{
exit(0);
}
}while(1);
cur_user=&pwd[i];
inodetemp=read_inode(0);sername);
else if(inodetemp->di_gid==1)
printf("由%s创建,属于普通用户组\n",pwd[inodetemp->di_uid-1].username); }。