1、 中北大学 操作系统课程设计 说明书 学院、系: 软件学院 专业: 软件工程 学生姓名: 申云如 学号: 1121011914 设计题目: 基于Linux的模拟文件系统的设计与实现 起迄日期: 2013年11月22日— 2013年12月6日 指导教师: 李玉蓉 2013 年 12月 6 日 1 需求分析 本次是基于Linux的模拟文件系统的设计与实现,其设计内容如下: 1、设计一个10个用户的文件系统.每个用户最多可以保存10个文件,一次运行用户可打开多个文件。 2、程序采用二级文件目录。(即设置主目录(MFD)和用户文件
2、目录(UFD)).另外,可打开文件设置指针. 3、为了方便实现,对文件的读写作了简化.在执行读写命令时,只需改读写指针。并不进行实际的读写操作。 4、实现的基本功能主要包括:改变目录(CD),创建目录(MD),显示目录(DIR),删除目录(RD),打开全部文件(openall),打开单个文件(open),建立一个文件(create),删除一个文件(delete),写文件(write),读文件(read),改文件的保护码(change),退出(exit)等. 要求: 考虑特殊情况如:各个命令对全路径和相对路径的支持、目录不存在时,给出错误信息、不能用cd进入文件、命令之中不能有空格(如
3、ex it,给出错误提示)、相对路径的解析、路径中的空格剔除、新建目录或文件时的问题、重名问题、目录或文件的名字长度限制、目录或文件的名字中包含不合法字符(注意空格)、删除目录或文件时的问题、删除不存在的文件或目录给出错误提示、删除目录时目录不为空(如果该目录为空,则可删除,否则给出是否做删除提示,删除操作将该目录下的全部文件和子目录都删除)、进入到某个目录下,却要删除本目录或上级目录、不能用delete删除目录、不能用RD删除文件等都要考虑在内。 用户验证和操作算法思想: 用结构体struct user来对用户信息进行存储,利用userHead链表对用户进行检索和查找在线用户,以便更好的
4、实现用户登录的验证。 目录操作算法思想: 首先用结构体struct ldir存储目录信息,利用数组对目录名以及目录创建时间进行存储,在每次创建目录时,检索目录链表,进行添加链表;改变目录,调用cd()来实现对目录的改变,删除文件时,依次检索链表来实现对链表的删除,并实施操作删除文件系统的目录;添加目录时,用添加链表的函数进行添加,并实施操作添加文件系统的目录. 文件操作算法思想: 首先用结构体struct fifle存储文件信息,利用数组对文件名,文件创建者,文件权限,文件创建时间,在每次创建文件时,检索文件链表,进行添加链表,并实施操作添加文件系统的目录;删除文件时,依次检索链表来实
5、现对链表的删除,并实施操作删除文件系统的文件;改变文件权限时,查找文件链表并返回文件的基本信息,开始对文件的权限修改. 2 总体设计 本程序共分为11个功能,在小组任务分配中共分为四个部分:文件系统的整体设计接口和用户验证、目录和文件链表的操作和接口实现、目录操作功能的实现以及文件操作功能的实现。 主函数首先对用户进行验证,然后调用11个函数,来实现对文件系统各功能的实现,各函数为: cd();md();dir();rd();open();creat();delet();writ(); chmode();help();exit(1); 主函数主要是先对用户链表
6、进行初始化,然后进行用户验证以及登录,并选择命令对文件进行操作. 整体流程图如下图2—1所示: 图2—1 3.详细设计 //添加目录列表 void adddir(char dirname[],char creattime[]) { struct ldir *p,*q; q=(struct ldir *)malloc(sizeof(struct ldir)); strcpy(q—〉dirname,dirname); strcpy(q->creattime,creattime); p=dirHead; if(p==NULL)
7、 //判断是否是头指针userHead { dirHead=q; dirHead—>next=NULL; } else { while(p-〉next!=NULL) { p=p—〉next; } p-〉next=q; q->next=NULL; } }//创建目录 void md() { time_t ptime; time(&ptime); c
8、har dirname[20]; int stat=0; //判断目录是否创建成功 printf("请输入创建的目录名:\n"); scanf(”%s",dirname); stat=mkdir(dirname); //创建目录 if(!stat) { printf(”目录创建成功!\n") ; adddir(dirname,ctime(&ptime)); } else { printf(”目录创建失败!\n”);
9、 } }//改变目录 void cd() { char curdir[30]; //当前目录 char dirname[10]; //改变目录 printf("当前路径为:\n"); strcpy(curdir,getcwd(NULL,0)); printf(”%s\n",curdir); printf(”请输入改变的目录\n”); scanf(”%s”,dirname); chdir(dirname); //改变目录 strcat(curdir,"/");
10、 strcat(curdir,dirname); printf("改变后的目录为:\n"); printf(”%s\n”,curdir); } //删除目录 int deletdir(char dirname[]) { struct ldir *p,*q; p=dirHead; if(p==NULL) //检验链表是否为空 { return 0; } while(p!=NULL&&strcmp(p-〉dirname,dirname)) {
11、 q=p; p=p—〉next; //保存上一指针 } if(p==dirHead) //寻找目录名是头指针 { dirHead=dirHead—〉next; } else { q—〉next=p-〉next; } free(p); //释放占用内存 return 1; } //删除目录 void rd() { char dirname[20]; printf(”请输入要删除的目录名
12、\n"); scanf(”%s",dirname); if(deletdir(dirname)) { printf(”目录删除成功!\n"); rmdir(dirname); //删除目录 } else { printf("目录删除失败!\n"); } } //显示目录 void dir() { struct ldir *p; p=dirHead; while(p!=NULL) { pri
13、ntf("%s\t%s\n”,p->creattime,p-〉dirname); p=p-〉next; } } 登陆如图: 创建目录,显示目录如图: 删除目录如图: 改变目录如图: 4。心得体会 经过近两个星期的实验,这次的课程设计终于完成了.本次课程设计是基于Linux的模拟文件系统的设计与实现,本次课程设计是我们第一次运用linux编程,中间遇到了很多困难,在这次实验中,我们充分理解并运用了linux下的文件和目录的操作,理解了c语言的文件操作和目录操作,并且重新复习,理解了C语言,内存的开辟以及链表的使用方式。学习并熟悉了linux操作系统的使用,使用了linux下的C语言的编译环境gcc等的使用及操作方式,这对我们今后的学习发展有很大帮助。 在设计的过程中遇到了很多的问题,首先是我们不会用linux系统,再者就是在设计的过程中发现了自己的c语言编程有很多都不熟悉了,对以前所学过的知识理解得不到位,掌握得不够透彻,通过这次课程设计,我又把以前所学过的知识重新复习了一遍.总的来说,经过这次试验,我的知识得以扩充,能力得以提升。 8






