操作系统文件系统实验报告后附源代码目录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 512Login 登录结束是,登录成功输入用户名查找是否有改用户名输入密码是否密码是否正确否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);}elseif((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); }。