您好,欢迎来到刀刀网。
搜索
您的当前位置:首页操作系统课程设计报告

操作系统课程设计报告

来源:刀刀网


操作系统课程设计报告

专 业:计算机科学与技术 学 号: 姓 名: 提交日期:

操作系统课程设计报告

【设计目的】

(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。

(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力 【设计内容】

为Linux系统设计一个简单的二级文件系统。要求做到以下几点: 1.可以实现下列几条命令: login 用户登录 dir 列目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 cd 进出目录

2.列目录时要列出文件名,物理地址,保护码和文件长度 3.源文件可以进行读写保护 【实验环境】 Windows xp/7 C++/VC++

【相关知识综述】

1、文件系统

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

2、位示图

位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已经分配。有的系统把\"0\"作为盘块已分配的标记,把“1”作为空闲标志。(它们的本质上是相同的,都是用一位的两种状态标志空闲和已分配两种情况。)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。

1

操作系统课程设计报告

【设计思路】

本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。

首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2„并以编号作为物理地址,在目录中进行登记。

【程序主要流程图】

验证是否成

功? 是 目录

右键进行选择 操作

新建目录新建文件打开文件

结束

开始登录删除属性 2

操作系统课程设计报告

【源程序清单】

typedef struct //文件结构体 /*the structure of OSFILE*/ { int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/

char fname[MAXNAME]; /*file name*/ } OSFILE;

typedef struct //用户文件目录结构体 user file directory /*the structure of OSUFD*/ { char ufdname[MAXNAME]; /*ufd name*/ OSFILE ufdfile[MAXCHILD]; /*ufd own file*/ }OSUFD;

typedef struct //登陆 /*the structure of OSUFD'LOGIN*/ { char ufdname[MAXNAME]; /*ufd name*/ char ufdpword[8]; /*ufd password*/ } OSUFD_LOGIN;

typedef struct //文件打开模式 /*file open mode*/ { int ifopen; /*ifopen:0-close,1-open*/

int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE;

void DeleteF() /*Delete File*/ { int i,j,k=0; char str[255],str1[255]; char fname[MAXNAME]; k=ExistD(dirname); //获取用户的序号 printf(\"Please input filename:\"); gets(fname); //获得需要打开的文件名fname for(i=0;iufdfile[i].fname),strupr(fname))==0) {

3

操作系统课程设计报告

} }

void OpenF() /*Open File*/ { int i,k=0; char fname[MAXNAME]; //printf(\"\\n\\nC:\\\\%s>\ k=ExistD(dirname); printf(\"Please input filename:\"); gets(fname); //获得需要打开的文件名fname for(i=0;iufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=1; //打开文件 ifopen[k][i].openmode=ufd[k]->ufdfile[i].fmode; //将读写属性赋值 //test// printf(\"i=%d,k=%d\\n\ ///test// printf(\"openmode=%d\\n\ printf(\"Open file successfully!\\n\"); break; //打开文件则跳出循环

4

itoa(ufd[k]->ufdfile[i].fpaddr,str,10); //itoa函数,把数字转换成字符串

strcpy(str1,\"file\"); strcat(str1,str); strcpy(str,\"c:\\\\osfile\\\\file\\\\\"); strcat(str,str1); strcat(str,\".txt\"); //str为文件的物理路径 if(remove(str)==0)

//调用remove函数删除 第k个用户的第i个文件ufd[k]->ufdfile[i] { fpaddrno[ufd[k]->ufdfile[i].fpaddr] = 0; //位示图置为0,表示没被占用 for( j = i ;j<=fcount[k]-1;j++) //文件顺序往前移一位 ufd[k]->ufdfile[j] = ufd[k]->ufdfile[j+1] ; fcount[k] = fcount[k] - 1 ; //文件数-1 printf(\"Delete file successfully!\\n\"); //除了删除原文件,还要 删除dir中的东西 } else printf(\"Delete file fail!\\n\"); break; }

操作系统课程设计报告

} } }

void CloseF() /*Close File*/ { int i,k=0; char fname[MAXNAME]; k=ExistD(dirname); printf(\"Please input filename:\"); gets(fname); //获得需要关闭的文件名fname for(i=0;iufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=0; //关闭文件 ifopen[k][i].openmode=4; //fmode改为初始值4 printf(\"Close file successfully!\\n\"); break; } } }

void WriteF() /*Write File*/ { int i,k,n=0; char fname[MAXNAME]; char str[255],str1[255]; int flag=1; if (strcmp(strupr(ltrim(rtrim(dirname))),\"\")==0) { printf(\"\\nError.Please convert to ufd dir before read.\\n\"); wgetchar=1; return; } printf(\"\\nCaution:Open file first\\n\"); printf(\"Opened File(s) List:\\n\"); k=ExistD(dirname);

5

操作系统课程设计报告

for(i=0;iif (ifopen[k][i].ifopen==1) if ((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)) //文件属性为只写或者是读写才能write { printf(\"%15s\ n++; }

if((n%4==0)&&(n!=0)) printf(\"\\n\");

}

printf(\"\\n%d files openned.\\n\

if (n==0) wgetchar=1; if(n!=0) { printf(\"\\nPlease input FileName:\"); gets(fname); ltrim(rtrim(fname)); i=ExistF(fname); if(i>=0) { if(ifopen[k][i].ifopen==1) { if((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)) { itoa(ufd[k]->ufdfile[i].fpaddr,str,10); strcpy(str1,\"file\"); strcat(str1,str); strcpy(str,\"c:\\\\osfile\\\\file\\\\\"); strcat(str,str1); strcat(str,\".txt\"); //物理路径 int length=0; char c; printf(\"Please input text(\\'#\\' stands for end):\\n\"); fp_file=fopen(str,\"ab+\"); //在文件末尾加 add bit while((c=getchar())!='#') //以#为结尾 { fputc(c,fp_file); if (c!='\\n') length++; } //fprintf(fp_file,\"\\n\");

6

操作系统课程设计报告

fclose(fp_file); ufd[k]->ufdfile[fcount[i]-1].flength += length;//原长度加输入长度 printf(\"\\n\\'%s\\' has been written successfully!\\n\ } else { printf(\"\\nError.\\'%s\\' has been opened with WRITE ONLY mode. It isn\\'t read.\\n\ wgetchar=1; } } else { printf(\"\\nError.\\'%s\\' is in closing status. Please open it before read\\n\ wgetchar=1; } } else { printf(\"\\nError. \\'%s\\' does not exist.\\n\ wgetchar=1; } } }

7

操作系统课程设计报告

【测试结果】 1、创建用户

2、创建文件,并且打开读取文件

8

操作系统课程设计报告

3、写文件

4、删除文件

9

操作系统课程设计报告

【设计总结】

这两周的课程设计时间非常短,从中学到了很多知识,也为我们的学习提供了良好的实践平台。首先,通过老师的细心指导和同学们的相互帮助,让我对题目【二级文件系统】有了进一步了解。接下来,主要是研究老师所给的大部分代码,参考他的基本思路,并且思考每一个结构体在代码中的具体作用。这期间和一些同学交流了各自的思路,在交流中,大家渐渐的明确了这个程序的思路、框架结构等。我们所做的主要是补充了删除文件,打开文件,关闭文件,写文件这几个部分。

代码编写完了之后,实现了题目所要求的基本功能,但是在测试的过程中,还发现了这个程序存在各种各样的bug。不断的测试修改后,得到完善。

这次课设最大的收获在于:学会交流以及相互帮助。在大家的交流沟通之中,我们解决了一个又一个难题。

在这次课设中,我还意识到,要把这门课真真正正地学好,不单单只是为了能够应付考试,平时还要多加学习,多加努力才对。

【参考文献】

【1】C语言程序设计(第三版) 谭浩强

【2】计算机操作系统教程(第三版). 张尧学 史美林 张高

【3】计算机操作系统,西安电子科技大学出版社,方敏主编,2004.8

10

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务