




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级操作系统实验高级操作系统实验 报告报告 姓 名: 学 号: 专 业: 任 课 教 师: 2014 年 01 月 18 目目 录录 一、课程设计题目和目的一、课程设计题目和目的.1 二、课程设计要求二、课程设计要求.1 三、程序设计思想三、程序设计思想.1 四、文件系统的实现四、文件系统的实现.2 1.数据结构设计 .2 2.程序功能图 .3 3.实体关系图 .3 4.数据流图 .4 5.程序流程图 .5 (1) 建立文件:create(文件名,记录长度) .6 (2) 写文件:write(文件名,开始位置,字符串) .7 (3) 读文件:read(文件名,开始位置,长度) .8 (4) 显示文件所有内容 type(文件名) .8 (5) 删除文件 delete(文件名).9 (6) 重命名文件 ren(文件名,新文件名).10 (7) 查询文件属性 ask(文件名).11 (8) 关闭文件 close(文件名).12 五、程序运行结果及分析五、程序运行结果及分析.13 六、课程设计总结六、课程设计总结.15 七、参考文七、参考文献献.16 八、附录八、附录.17 一、课程设计题目和目的 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的 重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高 综合运用各专业课知识的能力。 二、课程设计要求 通过组长分工,我主要完成了如下几个功能的操作: 1创建文件:从命令中得到文件名,得到该文件的文件长度,建立文件。修改目录表。 4读文件:read 文件名 显示开始字节 显示的字节数 ,直接显示所需要的字 节数。 5写文件:write 文件名 插入的位置 插入的内容 6修改属性:修改文件属性 文件名,文件权限,文件长度等。 三、程序设计思想 阅读操作系统方面的书籍,了解操作系统的文件系统原理。结合分析课程设计要求, 确定实体以及它们之间的关系。实体关系有三张表(磁盘空间分配表、文件表、打开文 件表)、一个模拟磁盘的数组、命令服务和用户构成。用户负责输入命令。命令服务实 现命令的解释、命令检查、命令帮助以及调用相关模块执行相应的命令功能。 文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址 从打开文件夹栈中抛出。 文件打开则把文件的名称及其父指针写到文件列表同时置文件打开标志为 1,文件关闭则把文件 从打开列表中删除,同时置文件打开指针为 0,文件读取和写入都要检查文件是否在文件打开列表中, 未打开文件不能读写,只读文件不能写,只写文件不能读。 文件夹和文件创建,文件夹和文件的创建首先检验目录是否为空,为空则把文件夹或文件连接 到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,没有则把文 件夹或文件连接到该目录下的最后一个子节点,作为它的兄弟节点。 文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,删 除文件夹时利用了中序历遍来删除子树。 四、文件系统的实现 1.数据结构设计 通过分析课程设计要求,具体设计出如下数据结构: typedef struct uof /文件属性 char filename14; /文件名字 int mode; /文件的权限 0-readonly;1-writeonly;2-read/write int length; /文件长度 int addr; /物理块号 int state; /0-建立,1-建立 int readptr; ; 通过结构体,将文件名字、文件在磁盘的开始位置、文件长度、文件最大长度、文 件类型、创建时间结合在一起。文件类型,本模拟程序使用 txt 类型。设置一个线 性表来存储文件。 2.程序功能图 模拟文件系统 创 建 文 件 删 除 文 件 条 件 读 取 写 入 文 件 查 询 属 性 显 示 内 容 显 示 目 录 重 命 名 文 件 关 闭 文 件 文件系统提供的文件操作有建立文件(create)、删除文件(delete)、条件读取文件 (read)、写入文件(write)、查询文件的属性(ask)、显示文件所有内容(type)、重 命名文件(ren)、关闭文件(close)。可以通过键盘输入命令来模拟文件的操作。通 过 exit 命令退出程序。 3.实体关系图 用 户 命令服务 模拟磁盘磁盘空间分 配表 文件表打开文件表 命令服务使得用户能够输入命令,在需要时提供命令的帮助。同时能够分析命令,调用 相应的命令模块对模拟磁盘、磁盘空间分配表、文件表、打开文件表进行操作。磁盘空间分 配表记录模拟磁盘的使用情况。文件表记录文件的信息和在磁盘里的位置等信息。打开文件 表记录已打开的文件,对应文件表中的文件信息,和文件表里的文件节点类似,记录了文件 在模拟磁盘中的信息。 4.程序流程图 模拟文件系统提供的文件操作有建立(create) ,读取(read) ,显示(type) ,删除 (detele) ,写入(write),关闭(close),重命名(ren)和查询(ask)。在模拟程序中可从键盘上 输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(exit)停 止程序的执行。 开始 系统格式化 Y/N / 输入命令 命令表中有该命令? 分析命令 显示:命令帮助 无 创建删除读取显示重命名写入查询列表关闭 退出程序(exit) 执行命令执行命令 (1) 创建文件:create(文件名,记录长度) 模拟文件系统进行“创建文件”的处理流程如下: 开始 查询文件表 文件表中有名字? 返回 有 显示重命申请磁盘空间 空间申请成功? 显示失败 否 返回 无 在磁盘分配表中登记 登记:长度=0,最大长度=申请长度, 开始位置申请节点位置 空闲情况占用 在文件表中登记 登记:长度=0,最大长度=建立长度, 开始位置分配位置 文件类型txt,时间当前时间 在打开文件表中登记 登记:信息和文件表中类似 显示创建成功 返回 (2) 写文件:write(文件名,开始位置,字符串) 模拟文件系统进行“建立文件”的处理流程如下: 开始 查询打开文件表 查询文件表 在打开文件表里? 不在 在文件表里? 显示无文件 返回 不在 写进模拟磁盘 在 在 读取文件记录 write 参数合法? 合法 显示成功 返回 显示参数非法 非法 (3) 读文件:read(文件名,开始位置,长度) 模拟文件系统进行“读取文件”的处理流程如下: 开始 查询文件表 在打开文件表里? 不在 在文件表里? 显示无文件 返回 不在 在 在 读取文件记录 read 参数合法? 非法 显示参数非法 返回 根据参数读取模拟磁 盘里的记录 返回 合法 五实验程序说明: 1.创建文件: 2.打开文件: 3.写文件: 4.修改文件属性: 六、课程设计总结 通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深 了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。还有让我感受挺深的是对软 件工程方法的应用。设计一个软件,先要做好需求分析,这一点很重要,如果没有分析好需 求,到软件设计的最后,发现所做的功能不符合要求,那么一切都得重做,前面所有的努力 都付诸东流。在程序设计的开始,由于分析工作做得不够深入和细致,吃了点小苦头。对于 这样一个小设计来说,都会吃苦头,要是大工程更是无法想像,有可能会项目失败。以后得 加强对软件工程的学习。另外在运用 C 语言的时候,感觉有点生疏,在组织语言时时而出错, 在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都可以从相关资料中找 到解决方法,有些问题是无法预料到的,这就需要通过自己理性的分析得出问题的解决方案。 在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。在对自 己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识, 同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以 使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在平时的 学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会 在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的思维能力, 就一定会有更大更辉煌的发展和提高。 七、参考文献 1美Abraham Silberschatz Peter Baer Galvin Greg Gagne 郑扣根 译.OPERATING SYSTEM CONCEPTSSixth Edition 操作系统概念.高等教育出版社,2004,01 2(美)Roger S.Pressman 著 梅宏 译.软件工程-实践者的研究方法.机械工业出版社, 2002,09 3蔡启先.C 语言程序设计教程(第二版).重庆大学出版社,2003,07 4朱战立.数据结构.西安电子科技大学出版社,2003,05 八、附录 1.程序源代码及注释 / / 编译工具:Visual c+ 6.0 / / / / 作者:小楚*smill 、蓝色的天空 / / 邮件:qvb20974151 / / / / 复制、传播请保留作者信息,谢谢! / / / / #include #include #include #include #include void fileCreate(char *fileName,int fileLenght); /创建文件 void fileDel(char *fileName); /删除文件 void fileRead(char *fileName,int postion,int lenght); void fileWrite(char *fileName,int position,char *s); /函数声明 void fileAsk(char *fileName); /查询文件属性 void fileType(char *fileName); /显示文件内容 void fileRen(char *fileName,char *newName); /重命名文件 void fileDir(); /列出所有文件 void fileClose(char *fileName); /关闭一个文件 int requestDisk(int *startPosition,int *maxLength); /分配磁盘空间 / /模拟磁盘空间 char disk10000; / /磁盘空间管理 struct freeDiskTable int start; /开始位置 int length; /占用长度 int maxLength; /最大长度 int useFlag; /使用标志,1 为占用,0 为空闲 ; / /文件表 struct fileTable char fileName20; /文件名字 int start; /开始位置 int length; /文件长度 int maxLength; /最大长度 char fileKind8; /文件种类,此默认为 txt struct tm *timeinfo; /文件创建时间 ; / /打开文件表 struct openFileTable char fileName20; /文件名字 char fileKind8; /文件类型 int start; /文件开始位置 int length; /文件长度 int maxLength; /最大长度 int openCount; /打开文件的进程数 struct tm *timeinfo; /文件创建时间 ; / typedef struct freeDiskTable LinDataType; /定义链表的数据类型 #include LinList.h /链表操作集合 SLNode *freeDiskTableHead; /定义磁盘分配表链表 头指针 #define MaxSize 100 /定义线性表 最大长度 typedef struct fileTable SeqDataType; /定义线性表数据类型 #include SeqList.h /线性表操作集合 SeqList L; /文件表,模拟文件操作嘛,文件数不多,故可以用 线性表,简化操作_ struct openFileTable OFT10; /打开文件表数组 int OFT_count=0; /打开文件表占用长度 void main() struct orderTable /命令表 char name8; ; char orderInput30; /存储用户输入的命令字符串 char orderName8; /命令名字 char fileName20; /命令参数 1,是文件名字 char parameter26; /命令参数 2,是个数字 char parameter330; /命令参数 3,是字符串或数字 struct orderTable u9; /命令表 int i=0; int flag=0; /用户输入串 读写位置 标志 int flagOrder=-1; / LinListInitiate(/磁盘空间分配键表初始化 struct freeDiskTable temp; temp.length=0; temp.maxLength=10000; temp.start=0; temp.useFlag=0; if(!LinListInsert(freeDiskTableHead,0,temp) printf(初始磁盘空闲表失败!); system(pause); exit(0); / /文件表初始化 SeqListInitiate( /初始化 文件表 / for(i=0;i2;i+) for(int j=0;j2;j+) system(color fc); printf(nnnnnnnnn 计 046 何珠举 操作系统课程设 计n); for(int k=0;k6) /命令名长度 小于 6 printf(输入的命令有误,请重新输入!n); continue ; orderNamei=0; flagOrder=-1; /初始化标志位,flagOrder 指明命令在命令表中的位置 for(i=0;i9;i+) if(!strcmp(orderName,) flagOrder=i; /记录命令的位置,以便访问 break; if(flagOrder=-1) printf(你输入的命令有误!请重新输入!n); continue ; / /以空格为界,分解字符串,分解出第一个字符串放到 fileName 中 for(i=flag+1;orderInputi!= i+) fileNamei-flag-1=orderInputi; fileNamei-flag-1=0; /为字符串数组 置一个结束标志 / flag=i; /下一个字符串 读写指针 if(!strcmp(fileName,?) /显示命令帮助 switch(flagOrder) case 0: printf(创建一个文件 格式 create filenamefilelengthn); printf(例如: create a1 1000 ,将创建名为 a1,长度为 1000 字节的文件 n); break; case 1: printf(删除一个文件 格式 delete filename n); printf(例如: delete a1,将删除名为 a1 的文件n); break; case 2: printf(读取一个文件 格式 read filenamepostionlengthn); printf(例如: read a1 8 3,从 a1 文件第 8 个字节开始,显示 3 字节内容 n); break; case 3: printf(写一个文件 格式 write fileNamepostionconten n); printf(例始: write a1 15 test,从 a1 文件第 15 字节开始写入 test 字 符串n); break; case 4: printf(显示文件的属性,格式 ask filenamen); printf(例如 ask a1 ,将显示文件 a1 的属性n); break; case 5: printf(显示文件的所有内容,格式 type filenamen); printf(例如 type a1,将显示文件 a1 的所有内容n); break; case 6: printf(重命名一个文件,格式 ren oldFileNamenewFileNamen); printf(例如 ren a1 b1 ,将 a1 改名为 b1n); break; case 7: printf(显示所有文件,例如 dir,将显示所有文件n); break; case 8: printf(关闭文件,格式 close fileNamen); printf(例如,close a1,将关闭文件 a1n); break; default: printf(命令错误); getch(); else switch(flagOrder)/对相应的命令 进行参数处理 case 0: int Temp4=1,10,100,1000; int sum=0; int len=0; for(i=flag+1;orderInputi!= i+) parameter2i-flag-1=orderInputi; parameter2i-flag-1=0; /为字符串数组 置一个结束标志 flag=i; len=strlen(parameter2); /求字符串数组的长度 for(i=0;ilen;i+) /把第二个参数 字符串变成整数 sum=sum+(int)parameter2len-i-1-48)*Tempi; fileCreate(fileName,sum); /将命令和参数 传给建文件模块执行 break; case 1: fileDel(fileName); /删除文件 break; case 2: int Temp4=1,10,100,1000; int sum=0; int len=0; int sum2=0; / for(i=flag+1;orderInputi!= i+) parameter2i-flag-1=orderInputi; parameter2i-flag-1=0; flag=i; len=strlen(parameter2); /求字符串数组的长度 for(i=0;ilen;i+) /把第二个参数 字符串变成整数 sum=sum+(int)parameter2len-i-1-48)*Tempi; / for(i=flag+1;orderInputi!= i+) parameter3i-flag-1=orderInputi; /把第三个参数变成整型 parameter3i-flag-1=0; flag=i; len=strlen(parameter3); for(i=0;ilen;i+) sum2=sum2+(int)parameter3len-i-1-48)*Tempi; fileRead(fileName,sum,sum2); /调用读文件模块 break; case 3: int Temp4=1,10,100,1000; int sum=0; int len=0; / for(i=flag+1;orderInputi!= i+) parameter2i-flag-1=orderInputi; parameter2i-flag-1=0; flag=i; len=strlen(parameter2); /求字符串数组的长度 for(i=0;ilen;i+) /把第二个参数 字符串变成整数 sum=sum+(int)parameter2len-i-1-48)*Tempi; / for(i=flag+1;orderInputi!= i+) parameter3i-flag-1=orderInputi; /获取第三个参数,为字符串 parameter3i-flag-1=0; flag=i; / fileWrite(fileName,sum,parameter3); /调用写文件模块 break; case 4: fileAsk(fileName); /查询文件属性 break; case 5: fileType(fileName); /显示文件内容 break; case 6: for(i=flag+1;orderInputi!= i+) parameter2i-flag-1=orderInputi; parameter2i-flag-1=0; flag=i; fileRen(fileName,parameter2); break; case 7: fileDir(); break; case 8: fileClose(fileName); break; default: printf(错误!没有可执行的命令); /以上主函数,主函数进行数据结构的定义 分析用户输入的命令。 /提供命令帮助。把命令和参数,传递给执行模块 / void fileCreate(char *fileName,int fileLength)/没有写到打开文件表 int i=0; time_t rawtime; int startPosition=0; /文件开始位置,等磁盘分配函数 返回值 int maxLength=fileLength; struct fileTable temp; for(i=0;iL.size;i+) if(!strcmp(fileName,L.listi.fileName) /判断是否重名,如果重名直接返回 printf(文件重名,请取别的名字!n); return ; /文件重名,退出创建函数 if(!requestDisk( return ; /申请磁盘空间失败,退出创建函数 strcpy(temp.fileName,fileName); strcpy(temp.fileKind,txt); /设置文件类型为 txt temp.length=0; /创建的时候,还没写入内容,是空文件,长度设为 0 temp.maxLength=fileLength; /文件的最大长度 temp.start=startPosition; /文件的开始位置 time( /获取时间 temp.timeinfo=localtime( /把时间写到结构体里去 if(!SeqListInsert( system(pause); exit(0); /把文件插入到 文件表,如果失败,退出程序 printf(成功创建文件!nn); printf(=n); printf(文件名 长度 最大长度 类型 开始位置n);/显示刚建立的文件 printf(%s ,temp.fileName); printf(%d ,temp.length); printf(%d ,temp.maxLength); printf(%s ,temp.fileKind); printf(%d ,temp.start); printf(n=n); printf(create 进程打开了文件%s,关闭请用 close 命令!nn,fileName); /写到打开文件表 strcpy(OFTOFT_count.fileName,temp.fileName); strcpy(OFTOFT_count.fileKind,temp.fileKind); OFTOFT_count.length=temp.length; OFTOFT_count.maxLength=temp.maxLength; OFTOFT_count.start=temp.start; OFTOFT_count.openCount=1; OFTOFT_count.timeinfo=temp.timeinfo; OFT_count+; /打开表 记录的是文件数 /printf(count%d,OFT_count); void fileDel(char *fileName) int i; int flag=0; int k=0; /记录文件在 文件表中的位置 SLNode *p; /磁盘空间分配表 指针 SeqDataType x; /存储被删除的结点,无特殊意义 for(i=0;inext) if(p-next-data.start=L.listk.start) p-next-data.useFlag=0; printf(成功删除!n); break; SeqListDelete(/从文件表中删除 void fileRead(char *fileName,int position,int length) int i; int flag=0; int k=0; for(i=0;iOFT_count;i+) /查找文件打开表,如果存在,则不需要再查找文件表 if(!strcmp(fileName,OFTi.fileName) k=i; flag=1; OFTi.openCount+;/多个进程打开,计算器加 1 break; if(flag!=1) /文件不在打开表,找到它,并写到打开表最后 for(i=0;iL.size;i+) if(!strcmp(fileName,L.listi.fileName) /找到文件,写到文件打开表 strcpy(OFTOFT_count.fileName,L.listi.fileName); strcpy(OFTOFT_count.fileKind,L.listi.fileKind); OFTOFT_count.length=L.listi.length; OFTOFT_count.maxLength=L.listi.maxLength; OFTOFT_count.start=L.listi.start; OFTOFT_count.timeinfo=L.listi.timeinfo; OFTOFT_count.openCount+; k=OFT_count; /OFT_count=1;/初次打开,赋值为 1 flag=1; /标志在打开文件表里 if(flag=1) if(positionOFTk.length) printf(读取参数错误,请检查参数!n); return ; for(i=0;ilength;i+) printf(%c,diskOFTk.start+position+i-1); /读取内容 printf(nread 进程打开了文件%s,关闭请用 close 命令!nn,fileName); void fileWrite(char *fileName,int position,char *s)/找到文件,写到打开表,根据 打开表操作 int i=0; int len=0; /计算写入字串长度,跟原来长度相加,如果超过最大长度,就失败 int k=0; /如果在 打开表里打到记录,则记录位置 int flag=0; /如果 flag=1,说明在打开表里找到了,不用在文件表里找了 len=strlen(s); for(i=0;i=OFTk.start+position;i-) diski+len=diski; /给插入的字符串 空出位置 for(i=OFTk.start+position;iOFTk.start+position+len;i+,j+) diski=sj; /写进磁盘 for(i=0;iL.size;i+) /改变文件长度 if(!strcmp(fileName,L.listi.fileName) L.listi.length=L.listi.length+len; /设置文件长度 break; OFTk.length=OFTk.length+len; /同时更新打开文件表中文件的长度 printf(成功写入!n); printf(write 进程打开了文件%s,关闭请用 close 命令!nn,fileName); else printf(无此文件,请输入正确的文件名!); void fileAsk(char *fileName) int i; int flag=0; for(i=0;iOFT_count;i+) /如果在打开表里 找到文件,则不用再找文件表 if(!strcmp(fileName,OFTi.fileName) printf(文件名:%sn,OFTi.fileName); printf(类型:%sn,OFTi.fileKind); printf(长度:%dn,OFTi.length); printf(打开进程数:%dn,OFTi.openCount); printf(创建时间:%sn,asctime(OFTi.timeinfo); flag=1; break; if(flag!=1) for(i=0;iL.size;i+) /从文件表里查找文件 if(!strcmp(fileName,L.listi.fileName) printf(文件名:%sn,L.listi.fileName); printf(类型:%sn,L.listi.fileKind); printf(长度:%dn,L.listi.length); printf(创建时间:%sn,asctime(L.listi.timeinfo); flag=1; break; if(flag=0) printf(无此文件!n); void fileType(char *fileName) int i; int flag=0; int k=0; for(i=0;iOFT_count;i+) if(!strcmp(fileName,OFTi.fileName) k=i; flag=1; OFTi.openCount+;/多个进程打开,计算器加 1 break; if(flag!=1) /文件不在打开表,找到它,并写到打开表最后 for(i=0;iL.size;i+) if(!strcmp(fileName,L.listi.fileName) /找到文件,写到文件打开表 strcmp(OFTOFT_count.fileName,L.listi.fileName); strcmp(OFTOFT_count.fileKind,L.listi.fileKind); OFTOFT_count.length=L.listi.length; OFTOFT_count.maxLeng
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陶瓷设计与生活环境关系考核试卷
- 质量管理与绩效改进出版考核试卷
- 运载火箭飞行轨迹与再入技术试题考核试卷
- 电气设备电力系统负荷特性分析考核试卷
- 钾肥生产工艺优化与节能考核试卷
- 通信产品批发商创新能力评估考核试卷
- 谊安510呼吸机操作与临床应用
- 麻醉专科护士工作汇报与专业发展
- 口腔修复学绪论
- 新生儿脐动静脉置管术
- 2025年金华国企义乌市建投集团招聘笔试参考题库含答案解析
- 道路白改黑施工方案及工艺
- 中高档竹工艺品项目可行性研究报告建议书
- 【MOOC】《中国哲学》(北京师范大学) 章节作业中国大学慕课答案
- 医院常见消毒剂的使用
- 国开电大《流通概论》形考任务
- 肺癌围手术期靶向治疗
- 《中国企业在“一带一路”沿线国投资风险分析及对策》12000字(论文)
- 【提分攻略·河北专用】《专题07 生物的遗传和变异》中考生物大题(解析版)
- 新版建设工程工程量清单计价标准解读
- 初中数学专题讲座课件
评论
0/150
提交评论