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